Я попытался запустить сценарий оболочки через удаленный сеанс, который запускает процесс в фоновом режиме с помощью команды.
nohup python3 run.py > nohup.out &
Когда удаленный сеанс закрыт, процесс завершается с сообщением:
Пойманный сигнал SIGHUP
SIGHUP пойман, но не демонизирован. Выход.
Я не понимаю; почему процесс прерывается, когда он запускается в фоновом режиме с помощью nohup & ?
background-process
nohup
Самые желанные Мани
источник
источник
tmux
и игнорируюnohup
или полностью отрекаюсь от фоновой задачи.Ответы:
Ваша программа на Python отменяется
nohup
.nohup
игнорирует сигнал зависания с помощьюSIG_IGN
и затем загружает вашу программу в том же процессе.Ваша программа Python быстро сбрасывает обработку сигнала для сигнала зависания, устанавливая свой собственный обработчик сигнала. Этот обработчик проверяет внутреннюю функцию (которая не очень хорошо спроектирована, основываясь на некоторых ошибочных предположениях, если это та, которую я видел) и решает, что надлежащий порядок действий при получении сигнала зависания - распечатать это сообщение. и выход.
Ваша программа на Python по
nohup
своему замыслу невозможна. В системе с оболочкой управления заданиями и семантикой сеансов / заданий POSIX вы должны выполнятьdisown
задание, чтобы оболочка никогда не знала об этом, чтобы сначала отправить ему сигнал зависания.(Даже этого недостаточно в операционных системах systemd. Поскольку люди, работающие с systemd, чуть-чуть ухватились за ухватку своего механизма сеанса входа в пользовательское пространство, вам также необходимо убедиться, что механизм systemd, который сигнализирует об отключении системы, а не зависает, для сеансы входа в систему при каждом выходе из системы также не включаются.)
дальнейшее чтение
источник
nohup
; не нашел лекарство от негоsetsid nohup python3 run.py > nohup.out &
, сетсид решил эту проблему. Это правильный подход?