[英]How to run nohup command from Python script?
我有一個簡單的問題。 我試圖尋找解決方案,但沒有答案可以解釋我需要什么。
問題是:如何從 Python 啟動nohup
命令? 基本上這個想法是,我有一個 Python 腳本來准備我的環境,我需要它來使用nohup
命令啟動多個腳本。 如何從正在運行的 Python 腳本中啟動nohup
命令,例如nohup python3 my_script.py &
以在我注銷后運行該 nohup 命令?
謝謝
你不需要nohup
—— 甚至在 shell 中不需要,在 Python 中更不用。 它執行以下操作:
nohup.out
/dev/null
就是這樣。 沒有理由使用nohup
來做任何這些事情; 沒有它,它們都是微不足道的:
</dev/null
重定向標准輸入從/dev/null
在殼; stdin=subprocess.DEVNULL
在 Python 中這樣做。>nohup.out
將標准輸出重定向到 shell 中的nohup.out
; stdout=open('nohup.out', 'w')
在 Python 中這樣做。2>&1
使 stderr 和 shell 中的 stdout 到同一個地方; stderr=subprocess.STDOUT
在 Python 中這樣做。由於您的進程沒有通過上述重定向連接到終端,因此當該終端關閉時,它不會隱式地獲得 HUP。 但是,如果您擔心將信號發送到父進程的整個進程組,則可以通過將子進程拆分為一個單獨的進程來避免這種情況:
subprocess.Popen
參數start_new_session=True
分裂子進程成從在Python父一個單獨的組,所以發送到父的進程組作為一個整體母體不會被兒童接收。signal.signal(signal.SIGHUP, signal.SIG_IGN)
preexec_fn
, signal.signal(signal.SIGHUP, signal.SIG_IGN)
添加preexec_fn
更加明確,即使收到一個 SIGHUP,孩子也應該默認忽略 SIGHUP。 把這一切放在一起可能看起來像(如果你真的想讓日志轉到一個名為nohup.out
的文件——我建議選擇一個更好的名字):
import subprocess, signal
subprocess.Popen(['python3', 'my_script.py'],
stdin=subprocess.DEVNULL,
stdout=open('nohup.out', 'w'),
stderr=subprocess.STDOUT,
start_new_session=True,
preexec_fn=(lambda: signal.signal(signal.NOHUP, signal.SIG_IGN)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.