Без nohup на csh фоновое задание продолжает работать после выхода из ssh

Без nohup на csh фоновое задание продолжает работать после выхода из ssh

Я пытаюсь понять необходимость использования nohupфоновых команд в ssh. Моя оболочка — csh на CentOS.

  1. Фоновая команда ниже продолжает работать даже после выхода из ssh. Я ожидал, что это произойдет только если nohupбудет префиксом команды.

    В каком сценарии это nohupможет понадобиться?

     ssh host 'sleep 80 >& /dev/null &'
    
  2. Я также попробовал интерактивную оболочку, и PID фонового задания все еще существует на хосте после выхода из ssh.

     ssh host sleep 80 >& /dev/null & exit
    
  3. Я также попробовал завершить интерактивный сеанс с помощью , 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.

Связанный контент