我有一個簡單的問題。我試圖尋找解決方案,但沒有答案可以解釋我需要什麼。
問題是:如何nohup
從 Python啟動命令?基本上這個想法是,我有一個 Python 腳本來準備我的環境,我需要它來使用nohup
命令啟動多個腳本。即使在我註銷後,如何從正在運行的 Python 腳本中啟動nohup
命令nohup python3 my_script.py &
,以運行該 nohup 命令?
謝謝
你不需要nohup
——甚至在 shell 中不需要,在 Python 中更不需要。它執行以下操作:
nohup.out
/dev/null
就是這樣。沒有理由用來nohup
做這些事情;沒有它,它們都是微不足道的:
</dev/null
從/dev/null
shell重定向標準輸入;stdin=subprocess.DEVNULL
在 Python 中這樣做。>nohup.out
將標準輸出重定向到nohup.out
shell;stdout=open('nohup.out', 'w')
在 Python 中這樣做。2>&1
使 stderr 與 shell 中的 stdout 位於同一位置;stderr=subprocess.STDOUT
在 Python 中這樣做。由於您的進程沒有通過上述重定向連接到終端,因此當該終端關閉時,它不會隱式地獲得 HUP。但是,如果您擔心將信號發送到父進程的整個進程組,則可以通過將子進程拆分為一個單獨的進程來避免這種情況:
subprocess.Popen
參數start_new_session=True
在 Python 中將子進程拆分為與父進程不同的組,因此發送到父進程組的父進程作為一個整體不會被子進程接收。preexec_fn
withsignal.signal(signal.SIGHUP, signal.SIG_IGN)
更加明確,即使收到了一個 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)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句