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

內索

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

問題是:如何nohup從 Python啟動命令?基本上這個想法是,我有一個 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/nullshell重定向標準輸入stdin=subprocess.DEVNULL在 Python 中這樣做。
  • >nohup.out將標準輸出重定向到nohup.outshell;stdout=open('nohup.out', 'w')在 Python 中這樣做。
  • 2>&1使 stderr 與 shell 中的 stdout 位於同一位置;stderr=subprocess.STDOUT在 Python 中這樣做。

由於您的進程沒有通過上述重定向連接到終端,因此當該終端關閉時,它不會隱式地獲得 HUP。但是,如果您擔心將信號發送到父進程的整個進程組,則可以通過將子進程拆分為一個單獨的進程來避免這種情況:

  • subprocess.Popen參數start_new_session=True在 Python 中將子進程拆分為與父進程不同的組,因此發送到父進程組的父進程作為一個整體不會被子進程接收。
  • 添加一個preexec_fnwithsignal.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用nohup执行多个命令

從 python 運行 shell 命令,以及如何將結果存儲在文件中(文本或 Excel 或 csv 等...)

如何在 Jupyter 筆記本中運行命令?

如何從 openVINO 運行樣本

如何在線運行我的 powershell 腳本?

在命令提示符停止之前運行腳本

如何從 R 獲取 Python 腳本

Python 運行與我的腳本不同的腳本

如何安排從anaconda運行的python腳本?

如何與始終運行的 python 腳本通信

如何通過命令啟動屏幕並運行python腳本

使用 ES6 模塊從命令行(Node JS)運行腳本中的函數

使用 nohup 依次運行多個 python 腳本

如何為在 docker 容器內運行的 corda 節點運行遷移腳本?

當我運行整個腳本時,powrshell 命令不運行

從 VS 代碼在 Python IDLE 中運行 python 腳本

從命令行反彙編 Python 腳本?

Python InDesign 腳本:如何運行預檢?

如何“重置”在使用 Flask 應用程序數據庫的 Python 腳本中運行的 db.session?

如何從使用 bash 腳本運行的 C 程序中獲取變量的值?

LUA - 如何停止運行腳本

導入後如何運行腳本?

運行 os 命令並解析輸出的 Kotlin 腳本

在命令行/批處理文件/python 腳本中運行 java 主類

從另一個腳本運行一個 python 腳本,其中命令行參數具有可執行文件

如何在 shell 腳本中運行 sacct 命令

如何運行python腳本直到它結束而沒有錯誤?

如何選擇 CPU 來運行 python 腳本?

如何在 Mac 上從 Dockerfile 運行 bash 腳本