Чи відключення від сеансу SSH вбиває ваші програми?


88

Так, скажімо , я роз'єднаний від SSH-сесії після того, як я почав rsyncабо cpабо будь-яку іншу команду , яка може бути довго працює. Чи продовжує ця команда виконуватись, поки вона не буде завершена після того, як я відключусь або просто її вбивають?

Завжди дивувався цьому.


Я просто хочу додати до сказаного вище, що, якщо ви опинитесь у ситуації, коли вам потрібно ввести вже запущений процес screen, спробуйте перезапустити .
сумний чувак

Це вб'є ваші програми. Дуже дратує, якщо ви оновлюєте версію ОС від скажімо Ubuntu 16.04 до 17.10 через SSH
kurdtpage

Відповіді:


118

Редагувати для 2016 року:

Це запитання передує системному дебаліку v230 . Як і для systemd v230, новим замовчуванням є вбивство всіх дітей завершеного сеансу входу, незалежно від того, які історично обгрунтовані запобіжні заходи були вжиті для запобігання цьому. Поведінка може бути змінено шляхом установки KillUserProcesses=noв /etc/systemd/logind.confабо обійти з допомогою Systemd конкретних механізмів для запуску демона в просторі користувача. Ці механізми виходять за рамки цього питання.

У тексті нижче описано, як традиційно працювали речі в дизайнерській області UNIX довше, ніж існувало Linux.


Вони будуть вбиті, але не обов’язково негайно. Залежить від того, скільки часу потрібно, щоб демон-SSH вирішив, що ваш зв’язок мертвий. Далі йде довше пояснення, яке допоможе зрозуміти, як це насправді працює.

Коли ви ввійшли в систему, демон SSH виділив для вас псевдотермінал і додав його до налаштованої оболонки входу вашого користувача. Це називається контрольним терміналом. Кожна програма, яку ви розпочали нормально в цей момент, незалежно від того, скільки глибоких шарів снарядів, в кінцевому рахунку простежить своє походження назад до цієї оболонки. Ви можете спостерігати за цим за допомогою pstreeкоманди.

Коли процес демон демонів SSH, пов'язаний з вашим з'єднанням, вирішить, що ваше з'єднання мертве, він надсилає сигнал зависання ( SIGHUP) в оболонку входу. Це сповіщає оболонку, яку ви зникли, і що вона повинна починати очищення після себе. У цей момент відбувається специфічна оболонка (шукайте на її документації на сторінці "HUP"), але здебільшого вона почне надсилати SIGHUPна запущені завдання, пов'язані з нею, перед тим, як припинити. Кожен з цих процесів, у свою чергу, буде робити все, що вони налаштовані робити при отриманні цього сигналу. Зазвичай це означає припинення. Якщо у цих робочих місць є власні завдання, сигнал також часто передається.

Процеси, які переживають завис керуючого терміналу, - це ті, що або відмежовували себе від терміналу (демонові процеси, які ви запустили всередині нього), або ті, на які було викликано префіксовану nohupкоманду. (тобто "не зациклюйся на цьому") Демони трактують сигнал HUP по-різному; оскільки вони не мають керуючого терміналу і не отримують автоматично сигнал HUP, він замість цього перераховується як запит адміністратора вручну перезавантажити конфігурацію. За іронією долі це означає, що більшість адміністраторів не вивчають "зависання" використання цього сигналу для недемонів набагато пізніше. Ось чому ти це читаєш!

Термінальні мультиплексори - це поширений спосіб зберегти ваше середовище оболонки недоторканим між відключеннями. Вони дозволяють вам відірватися від ваших процесів оболонки таким чином, що ви зможете повторно приєднатись до них пізніше, незалежно від того, чи було це відключення випадковим чи навмисним. tmuxі screenє більш популярними; синтаксис їх використання виходить за рамки вашого питання, але їх варто вивчити.


Мені було запропоновано розібратися, скільки часу потрібно, щоб демон SSH вирішив, що ваш зв’язок мертвий. Це поведінка, яка характерна для кожної реалізації демона SSH, але ви можете розраховувати, що всі вони припиняться, коли будь-яка сторона скидає з'єднання TCP. Це станеться швидко, якщо сервер намагається записати в сокет, а пакети TCP не будуть підтверджені, або повільно, якщо нічого не намагається записати в PTY.

У цьому конкретному контексті найімовірнішими факторами, які викликають запис, є:

  • Процес (як правило, на передньому плані), який намагається записати в PTY на стороні сервера. (сервер-> клієнт)
  • Користувач намагається записати на PTY на стороні клієнта. (клієнт-> сервер)
  • Голівки будь-якого сорту. Зазвичай вони не включені за замовчуванням ні клієнтом, ні сервером, і, як правило, є два варіанти: рівень програми та на основі TCP (тобто SO_KEEPALIVE). Keepalives дорівнює або серверу, або клієнту, нечасто надсилаючи пакети в іншу сторону, навіть коли нічого в іншому випадку не буде причин писати в сокет. Хоча це, як правило, призначене для спідниці між брандмауерами, які занадто швидко вичерпують з'єднання, це має додатковий побічний ефект, завдяки чому відправник помічає, коли інша сторона не реагує на це набагато швидше.

Тут застосовуються звичайні правила для сеансів TCP: якщо між клієнтом і сервером відбувається переривання зв’язку, але жодна сторона не намагається надіслати пакет під час проблеми, з'єднання збережеться за умови, що обидві сторони будуть реагувати згодом і отримувати очікуваний TCP порядкові номери.

Якщо одна сторона вирішила, що сокет мертвий, ефекти, як правило, негайні: процес sshd відправить HUPі самозавершиться (як описано раніше), або клієнт повідомить користувача про виявлену проблему. Варто зазначити, що те, що одна сторона вважає, що друга мертва, не означає, що іншу про це повідомляють. Осиротіла сторона зв'язку, як правило, залишається відкритою до тих пір, поки вона не спробує записати її та вимкнути час, або не отримає скидання TCP з іншої сторони. (якщо підключення було доступне в той час) Очищення, описане в цій відповіді, відбувається лише після того, як сервер помітив.


3
Я також додаю команду 'dtach' до цього списку - це щось протилежне екрану / tmux, оскільки воно дозволяє приєднувати кілька терміналів до одного сеансу, а також чудово підходить для продовження сеансу, хоча це не робить надайте будь-які засоби відтворення недавньої історії.
пухнастий

dtachURL тут: dtach.sourceforge.net
slm

2
відмінне пояснення. Я вже відчуваю себе більш linuxey!
fregas

3
Крім того, хоча це технічно не є частиною вашої відповіді, ось цікавий дрібницю: ви можете використовувати kill -HUPяк root, щоб змусити чийсь термінал зависнути. Ви не повинні робити це без поважних причин. Більшу частину пробігу я отримую від цього, коли користувачі залишають оболонки під час технічного обслуговування, і мені потрібно відключити файлову систему, що їх оболонка тримає відкритою. Якщо користувач підключений, але не працює в режимі очікування, надішліть сигнал його sshd-процесу. В іншому випадку, якщо він працює всередині термінального мультиплексора, надішліть його оболонці, яку ви хочете зупинити. Вішайте тільки оболонку, щоб не працювати!
Андрій Б

@AndrewB, ви можете, будь ласка, детальніше розповісти про те, як "процес демона SSH ... вирішує, що ваш зв’язок мертвий"? І як я можу знати, якщо демон SSH думає / знає, що (який) зв’язок мертвий чи ні?
Сяо Пен - ZenUML.com

22

Як вже згадували інші, щойно ви від'єднаєтесь від ssh, все, що працює в ньому, вже не буде.

Як згадували @Michael Hampton та інші, ви можете використовувати такі інструменти, як tmuxабо screenдля відключення / підключення до терміналів, не втрачаючи їх вміст (тобто дочірні процеси).

Крім того, ви можете поставити процес на задній план за допомогою ampersand, &а потім скористатися командою, disownщоб роз'єднати їх з поточною оболонкою.

# start a command
% sleep 5000 &
[1] 3820

# check it
% jobs
[1]+  Running                 sleep 5000 &

# disown everything
% disown -a

# check it again (gone from shell)
% jobs
%

# but it's still running on the system
% ps -eaf|grep "[s]leep"
saml      3820 23791  0 00:16 pts/1    00:00:00 sleep 5000
%

Чи можливо повторно приєднати сеанс терміналу до disownпроцесу ed?
Підроблене ім’я

4
Так. Детальніше дивіться у цьому питанні щодо U&L: unix.stackexchange.com/questions/4034/…
slm

13

Ні, будь-які програми, які все ще приєднані до терміналу, і не розміщені на задньому плані з чимось подібним nohup, будуть вбиті.

Ось чому існують віртуальні термінальні рішення, як tmuxі старіші, screenякі створюють сеанси, які продовжують працювати, навіть якщо ви від'єднані, і до яких ви можете повторно вкластись пізніше.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.