簡體   English   中英

如何從 Python 腳本運行 nohup 命令?

[英]How to run nohup command from Python script?

我有一個簡單的問題。 我試圖尋找解決方案,但沒有答案可以解釋我需要什么。

問題是:如何從 Python 啟動nohup命令? 基本上這個想法是,我有一個 Python 腳本來准備我的環境,我需要它來使用nohup命令啟動多個腳本。 如何從正在運行的 Python 腳本中啟動nohup命令,例如nohup python3 my_script.py &以在我注銷后運行該 nohup 命令?

謝謝

你不需要nohup —— 甚至在 shell 中不需要,在 Python 中更不用。 它執行以下操作:

  • 將 HUP 信號配置為忽略(很少相關:如果一個進程在 TTY 上沒有句柄,則無論如何都不會在該 TTY 退出時收到通知;shell 僅在交互模式下將信號傳播給子進程,而不是在運行腳本時) .
  • 如果 stdout 是終端,則將其重定向到nohup.out
  • 如果 stderr 是終端,則將其重定向到 stdout 已重定向的任何位置。
  • 將標准輸入重定向到/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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM