Я пытаюсь понять необходимость использования nohup
фоновых команд в ssh. Моя оболочка — csh на CentOS.
Фоновая команда ниже продолжает работать даже после выхода из ssh. Я ожидал, что это произойдет только если
nohup
будет префиксом команды.В каком сценарии это
nohup
может понадобиться?ssh host 'sleep 80 >& /dev/null &'
Я также попробовал интерактивную оболочку, и PID фонового задания все еще существует на хосте после выхода из ssh.
ssh host sleep 80 >& /dev/null & exit
Я также попробовал завершить интерактивный сеанс с помощью ,
kill -HUP PID
а неexit
, и PID фонового задания все еще существует на хосте после выхода из ssh.
Что-то я делаю не так?
решение1
Нет, афонГруппа процессов (задание) НЕ завершается по умолчанию при завершении работы лидера сеанса (оболочки) или при завершении работы его управляющего терминала.
Это происходит лишь в некоторых особых случаях:
(1)Фоновая работа - этоостановился, в этом случае он будет отправлен SIGHUP
/ SIGCONT
пару сигналовядро. Если SIGHUP
сигнал не будет перехвачен или проигнорирован процессом, процесс завершится.
Определение остановленного задания: любое задание, содержащее остановленный процесс. Процессспатьпри блокировке системного вызова, например nanosleep(2)
или , read(2)
НЕ считается остановленным.
(2)Процесс пытается выполнить чтение или запись на терминале, который больше не существует, и завершает работу (по собственной воле) из-за ошибок, которые возникают при попытке сделать это.
(3)Работа на самом делепередний планработа.ядропосылает SIGHUP
сигнал группе процессов переднего плана, когда лидер сеанса / управляющий процесс (т. е. оболочка) завершается. Управляющий процесс сам получает сигнал, SIGHUP
когда его управляющий терминал отключается, что обычно приводит к его завершению.
Даже команды, начинающиеся с , &
на самом деле являются частьюпередний плангруппа процессов, когда они запускаются из оболочки без управления заданиями (что в большинстве оболочек, но не в csh, является значением по умолчанию при запуске)скриптыиподоболочки).
(4)Вы используете оболочку вроде bash
или zsh
, которая делает все возможное, чтобы отправить SIGHUP
сигнал всем своим заданиям, когда она сама получает сигнал SIGHUP
(согласно пункту 3 выше, оболочка является контролирующим процессом), или просто когда она завершает работу (последнее значение по умолчанию только в zsh
, но не по умолчанию и зависит от shopt huponexit
параметра в bash).
Theоболочка csh(либо реальный, csh
либо tcsh
)не имеет такого поведенияиз bash
или zsh
. В tcsh
(но НЕ в реальном csh
) вы можете запустить команду со hup
встроенной функцией, чтобы она была выполнена при выходе из оболочки:
tcsh% hup sleep 3600 &
tcsh% exit
$ pgrep sleep
[nothing]
(5)Ваша система init делает все возможное, чтобы очистить любые завершенные сеансы пользователя. В своей конфигурации по умолчанию,системдбудет сигнализировать все процессы изобъемс SIGTERM
последующим a SIGKILL
после задержки, так что это nohup
НЕ поможет вам с этим в любом случае. Также, идея systemd ообъемне соответствует сеансу процесса Unix, поэтому запуск команды с ним setsid(1)
также не позволит ему выйти из него.
Вероятно, вы можете изменить поведение systemd, отклонившись от значений по умолчанию для параметров KillUserProcesses=yes
, KillMode=control-group
, KillSignal=SIGTERM
и SendSIGKILL=yes
.