Почему не работает фоновый процесс nohup?

10

Я попытался запустить сценарий оболочки через удаленный сеанс, который запускает процесс в фоновом режиме с помощью команды.

nohup python3 run.py > nohup.out &

Когда удаленный сеанс закрыт, процесс завершается с сообщением:

Пойманный сигнал SIGHUP

SIGHUP пойман, но не демонизирован. Выход.

Я не понимаю; почему процесс прерывается, когда он запускается в фоновом режиме с помощью nohup & ?

Самые желанные Мани
источник
1
Раньше меня смущало все неожиданное поведение управления заданиями оболочки. Теперь я просто использую tmuxи игнорирую nohupили полностью отрекаюсь от фоновой задачи.
Сиюань Рен

Ответы:

10

Ваша программа на Python отменяется nohup.

nohupигнорирует сигнал зависания с помощью SIG_IGNи затем загружает вашу программу в том же процессе.

Ваша программа Python быстро сбрасывает обработку сигнала для сигнала зависания, устанавливая свой собственный обработчик сигнала. Этот обработчик проверяет внутреннюю функцию (которая не очень хорошо спроектирована, основываясь на некоторых ошибочных предположениях, если это та, которую я видел) и решает, что надлежащий порядок действий при получении сигнала зависания - распечатать это сообщение. и выход.

Ваша программа на Python по nohupсвоему замыслу невозможна. В системе с оболочкой управления заданиями и семантикой сеансов / заданий POSIX вы должны выполнять disownзадание, чтобы оболочка никогда не знала об этом, чтобы сначала отправить ему сигнал зависания.

(Даже этого недостаточно в операционных системах systemd. Поскольку люди, работающие с systemd, чуть-чуть ухватились за ухватку своего механизма сеанса входа в пользовательское пространство, вам также необходимо убедиться, что механизм systemd, который сигнализирует об отключении системы, а не зависает, для сеансы входа в систему при каждом выходе из системы также не включаются.)

дальнейшее чтение

JdeBP
источник
3
Это их программа Python, или это интерпретатор Python (/ среда выполнения), который делает это молча за их спиной?
ilkkachu
Кроме того, в Mac OS выход из сеанса ssh убивает работу оболочки, даже когда вы начали использовать nohup; не нашел лекарство от него
imhotap
Что ж, если проблема в обработчике сигналов, то OP может просто изменить обработчик сигналов на обработчик, который не прерывает процесс. Это должно работать независимо от того, кто устанавливает такой обработчик сигнала. Я хотел бы добавить относительно ssh: иногда, даже если процесс поддерживается, у него могут быть проблемы. Пару лет назад я потерял довольно много времени, пытаясь понять некоторые ошибки прав доступа, и, в конце концов, виновником стал Kerberos: когда сессия ssh была закрыта, токены истекли, поэтому мне пришлось создавать новые токены для использования вместо этих. сеанса SSH.
Бакуриу
@JdeBP Я пытался setsid nohup python3 run.py > nohup.out &, сетсид решил эту проблему. Это правильный подход?
Mostwanted Mani