12

Этот вопрос возник довольно много (действительно много), но я нахожу ответы, как правило, неполными. Общий вопрос: «Почему моя работа не убивается, когда я выхожу / убиваю ssh?«И вот что я нашел. Первый вопрос: насколько общая информация следующая? Кажется, что следующее верно для современного Debian linux, но я упускаю некоторые моменты; и что нужно знать другим?

  1. Все дочерние процессы, фоновые или нет оболочки, открытой через ssh-соединение, уничтожаются с помощью SIGHUP, когда ssh-соединение закрывается, только если установлена опция huponexit : запустите shopt huponexit чтобы проверить, верно ли это.

  2. Если huponexit имеет значение true, то вы можете использовать nohup или disown чтобы отделить процесс от оболочки, чтобы он не был убит при выходе. Или запустить вещи с screen .

  3. Если huponexit имеет значение false, что является значением по умолчанию, по крайней мере, в некоторых linux в наши дни, то фоновые задания не будут уничтожены при обычном выходе из системы.

  4. Но даже если huponexit ложно, то если соединение SSH убивает, или капли (различные чем нормальный выход из системы), то фоновые процессы будут еще убить. Этого можно избежать с помощью disown или nohup как в (2).

  5. Существует некоторое различие между (a) процессами, родительский процесс которых является терминалом, и (b) процессами, к которым подключен stdin, stdout или stderr. Я не знаю, что происходит с процессами, которые (а), а не (б), или наоборот.

Последний вопрос: как я могу избежать поведения (3)? Другими словами, по умолчанию в фоновых процессах Debian весело запускаются сами после выхода из системы, но не после разрыва соединения ssh. Мне бы хотелось, чтобы одно и то же происходило с процессами независимо от того, было ли соединение нормально закрыто или разорвано. Или это плохая идея?

Редактировать: Другой, важный способ сохранить рабочие места убитых, который работает (?) в любом случае это запустить их через экран. Но вопрос больше в том, чтобы понять, когда что-то убивают, а когда нет: иногда люди хотят, чтобы рабочие места были убиты, например, при выходе из системы.

Дополнительные темы:- Разъяснение сигналов (sighup), заданий и управляющего терминала - https://serverfault.com/questions/117152/do-background-processes-get-a-sighup-when-logging-off - Продолжить SSH фоновые задачи / задания при закрытии SSH - Будет ли задание, помещенное в фоновом режиме, продолжать работать после закрытия сеанса SSH? - Предотвратить остановку уже запущенного фонового процесса после закрытия клиента SSH. - Как я могу запустить процесс через SSH, чтобы он продолжал выполняться после моего отключения? - Невозможно сохранить удаленную работу на OS X - Закрыть SSH соединение

1 ответ1

2

Пункты 1-4 верны.Я ничего не знаю о пункте 5. Что касается вашего последнего пункта, прекрасное приложение, screen, позволит вам позволить всем процессам работать до их естественного завершения, независимо от того, как вы прервете свое соединение. Экран в репо.

Человеческое описание экрана не легко прочитать, но, среди прочего, оно гласит:

Когда вызывается screen, он создает одно окно с оболочкой (или указанной командой), а затем уходит с вашего пути, чтобы вы могли использовать программу, как обычно. Затем, в любое время, вы можете создавать новые (полноэкранные) окна с другими программами в них (включая другие оболочки), убивать существующие окна, просматривать список окон, включать и выключать выходной журнал, копировать и вставлять текст между окнами, просматривать историю прокрутки, переключаться между окнами любым удобным для вас способом и т. д. Все окна запускают свои программы совершенно независимо друг от друга. Программы продолжают работать, когда их окно в данный момент не видно и даже когда весь сеанс экрана отсоединен от пользовательского терминала. Когда программа завершает работу, экран (по умолчанию) убивает окно, в котором оно находилось. Если это окно было на переднем плане, дисплей переключается на предыдущее окно; если ничего не осталось, экран выходит.

Я выдвинул на первый план самую важную часть: вы можете отсоединить окно с помощью команды Ctrl+a+d, а затем вы можете убить / выйти из сеанса, и теперь отсоединенное окно будет продолжать работать, а программы внутри все еще работают. Когда вы подключаетесь обратно, например, инициируя новый сеанс ssh, команда screen -r возобновит сеанс экрана, который был отсоединен ранее, с четким отображением всех выводов в стандартную ошибку / вывод.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .