Это продолжение этого вопроса .
Я провел еще несколько тестов; похоже, что на самом деле не имеет значения, выполняется ли это на физической консоли или через SSH, и при этом это не происходит только с SCP; Я также проверил это с cat /dev/zero > /dev/null
. Поведение точно такое же:
- Запустите процесс в фоновом режиме, используя
&
(или поместите его в фоновом режиме после того, как он начал использоватьCTRL-Z
иbg
); это делается без использованияnohup
. - Выйти.
- Войдите снова.
- Процесс все еще там, счастливо протекает, и теперь является непосредственным ребенком
init
.
Я могу сразу подтвердить как SCP, так и CAT, если отправил SIGHUP
; Я проверил это с помощью kill -HUP
.
Таким образом, похоже, что SIGHUP не отправляется при выходе из системы, по крайней мере, в фоновые процессы (по понятным причинам не может тестироваться с передним планом).
Сначала это случилось со служебной консолью VMware ESX 3.5 (которая основана на RedHat), но я смог воспроизвести ее точно на CentOS 5.4.
Вопрос, опять же, не должен ли SIGHUP отправляться процессам, даже если они работают в фоновом режиме, после выхода из системы? Почему этого не происходит?
редактировать
Я проверил strace
, согласно ответу Кайла.
Как я и ожидал, процесс не получает никакого сигнала при выходе из оболочки, в которой он был запущен. Это происходит как при использовании консоли сервера, так и через SSH.
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=10676, si_uid=3000090} --- rt_sigreturn() = -1 EINTR (Interrupted system call) rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
--- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=13944, si_uid=3000090} --- +++ killed by SIGHUP +++
huponexit
.Ответы:
Ответ найден.
Для BASH это зависит от параметра
huponexit
оболочки, который можно просмотреть и / или установить с помощью встроеннойshopt
команды.Похоже, эта опция отключена по умолчанию, по крайней мере, в системах на базе RedHat.
Больше информации на странице руководства BASH :
источник
Он будет отправлен SIGHUP в моих тестах:
оболочку1:
Shell2:
Shell1 снова:
Shell2 снова :
Почему он все еще работает ?:
Расширенное программирование в среде Unix от Стивенса рассматривает это в разделе 9.10: «Потерянные группы процессов». Наиболее актуальный раздел:
источник
$ strace -e signal -p1705 Process 1705 attached --- stopped by SIGTSTP --- --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=791, si_uid=3000090} --- +++ killed by SIGTERM +++
Странно, определенно не в соответствии с разделом, цитируемым Стивенсом.Я провел несколько тестов, используя CentOS 7.1 и bash. Обратите внимание, что это означает,
huponexit
чтоoff
по умолчанию оно отключено для большинства моих тестов.Вам нужно,
nohup
когда вы запускаете задание в терминале, потому что, если вы закрываете этот терминал, не выходя из оболочки чисто , терминал отправляет bash сигнал SIGHUP в оболочку, которая затем отправляет его всем дочерним элементам. Если вы аккуратно выходите из оболочки - значит, задание уже должно быть в фоновом режиме, чтобы вы могли вводитьexit
или нажимать Control-D в командной строке - никакие сигналы любого рода не отправляются в фоновое задание из bash.Тест:
Терминал 1
Терминал 2
(закрыть терминал 1, видно в терминале 2):
Работа
doit.sh
:Запустите его в фоновом режиме в терминале 1:
Терминал 1
Разместите это в Терминале 2; закройте Терминал 1 после нескольких петель:
Терминал 2
Выход в Терминал 3:
Терминал 3
Однако, если вы выходите
bash
, он просто выходит, вообще не посылая никакого сигнала ребенку. Терминал выйдет, потому что у него больше нет дочернего, но, конечно, нет никого, кто мог бы подключиться к HUP, потому что дочерняя оболочка уже пропала.SIGINT
,SIG_BLOCK
ИSIG_SETMASK
вы видите ниже, в связи сsleep
в оболочке.Терминал 1
Терминал 2
Терминал 3, выход
Интересно, что я установил ,
huponexit
чтобы быть сshopt -s huponexit; shopt
(последняя shopt к обзору), затем выполняется последнее испытание, и снова удар не посылали сигнал фонового процесса . Даже MORE Interstingly, как мы уже видели Баш сделал послать сигнал на фоновый процесс после того, как он получил его от терминала , который был закрыт в его лице. Кажется, чтоhuponexit
не имеет никакого отношения ни к одному, ни к другому.Я надеюсь, что это устранит любую тайну или путаницу относительно, по крайней мере, счастья Баша, о том, когда и как отправляется сигнал HUP. По крайней мере, мои тесты были полностью воспроизводимы для меня. Мне было бы интересно узнать, есть ли другие параметры, которые могут влиять на поведение bash.
И, как всегда, YSMV (ваша оболочка может меняться).
Приложение 1
Когда я запускаю оболочку как
exec /bin/sh
, затем запускаю сценарий как/bin/sh ./doit.sh &
, а затем аккуратно выхожу из оболочки, никакие сигналы не отправляются в фоновое задание и он продолжает выполняться до завершения.Приложение 2
Когда я запускаю оболочку как
exec /bin/csh
, затем запускаю сценарий как/bin/sh ./doit.sh &
, а затем аккуратно выхожу из оболочки, никакие сигналы не отправляются в фоновое задание и он продолжает выполняться до завершения.источник
Я использую csh, и фоновые процессы продолжают выполняться после выхода из системы.
источник