Background-Process

為什麼 nohup 後台程序被殺死?

  • June 3, 2018

我嘗試通過遠端會話啟動一個 shell 腳本,它使用命令在後台啟動一個程序。

nohup python3 run.py > nohup.out &

當遠端會話關閉時,程序將被以下消息殺死:

捕捉到信號 SIGHUP

SIGHUP 被擷取但未被守護。退出。

我不明白; **為什麼程序在後台使用nohup &**啟動時會被殺死?

您的 Python 程序撤消了nohup.

nohup忽略掛斷信號,SIG_IGN然後在同一程序中連結載入您的程序。

您的 Python 程序會立即重置掛斷信號的信號處理,安裝自己的信號處理程序。該處理程序檢查一個內部函式(設計得不是很好,基於一些有缺陷的假設,如果它是我所看到的)並決定在收到掛斷信號時適當的操作過程是列印該消息並退出。

您設計的 Python 程序是不可nohup用的。在具有作業控制 shell 和 POSIX 會話/作業語義的系統上,您需要disown執行作業,以便 shell 永遠不會知道它首先向它發送掛斷信號。

(即使在 systemd 作業系統上這還不夠。因為 systemd 的人已經對他們的使用者空間登錄會話機製做了一點點豬耳朵,你還需要確保 systemd 發出系統關閉而不是掛斷信號的機制,以每次註銷時的登錄會話也不會啟動。)

進一步閱讀

引用自:https://unix.stackexchange.com/questions/446625