
Я попробовал запустить скрипт оболочки через удаленный сеанс, который запускает процесс в фоновом режиме с помощью команды.
nohup python3 run.py > nohup.out &
При закрытии удаленного сеанса процесс завершается с сообщением:
Пойман сигнал SIGHUP
SIGHUP пойман, но не демонизирован. Выход.
Я не понимаю, почему процесс завершается, если он был запущен в фоновом режиме с помощьюнет и?
решение1
Ваша программа Python отменяет nohup
.
nohup
игнорирует сигнал зависания, SIG_IGN
а затем последовательно загружает вашу программу в тот же процесс.
Ваша программа Pythonбыстро сбрасываетобработка сигнала для сигнала hangup, установка собственного обработчика сигнала. Этот обработчик проверяет внутреннюю функцию (которая не очень хорошо спроектирована, поскольку основана на некоторых ошибочных предположениях, если это та, которую я видел) и решает, что правильным курсом действий при получении сигнала hangup будет распечатать это сообщение и выйти.
Ваша программа Python по своей природе не является nohup
-able. В системе с оболочкой управления заданиями и семантикой сеанса/задания POSIX вам нужно ing disown
задание так, чтобы оболочка никогда не узнала о нем, чтобы послать ему сигнал зависания в первую очередь.
(Даже этого недостаточно для операционных систем systemd. Поскольку разработчики systemd немного испортили свой механизм сеансов входа в пользовательское пространство, вам также необходимо убедиться, что механизм systemd, который подает сигнал о завершении работы системы, а не о зависании, для сеансов входа при каждом выходе из системы, также не срабатывает.)
дальнейшее чтение
- https://docs.cherrypy.org/en/latest/_modules/cherrypy/process/plugins.html
- Пытается ли nohup сделать так, чтобы у программы не было управляющего терминала?
- Разница между nohup, disown и &
- Когда tmux завершает работу (закрывает pty master), фоновые процессы из скриптов запуска завершаются — почему?
- https://unix.stackexchange.com/a/310775/5132
- https://unix.stackexchange.com/a/379264/5132