我有个简单的问题。我试图寻找解决办法,但没有任何答案可以解释我需要什么。
问题是:如何从Python启动nohup
命令?基本上,我的想法是,我有一个Python来准备我的环境,我需要它来用nohup
命令启动多个脚本。如何从运行中的Python中启动nohup
命令(如nohup python3 my_script.py &
),使nohup命令即使在我注销后也能运行?
谢谢
发布于 2021-10-21 15:38:36
您不需要nohup
--即使在shell中也不需要,在Python中更不需要。它做了以下事情:
nohup.out
/dev/null
的任何位置。
就这样。没有理由使用nohup
来做任何这些事情;没有它,它们都是微不足道的:
</dev/null
在shell中将stdin从/dev/null
重定向;stdin=subprocess.DEVNULL
在Python.>nohup.out
中将stdout重定向到shell中的nohup.out
;stdout=open('nohup.out', 'w')
在Python.2>&1
中将stderr重定向到与shell中的stdout相同的位置;stderr=subprocess.STDOUT
在Python.2>&1
中这样做。因为您的进程没有通过上面的重定向连接到终端,所以当该终端关闭时,它不会隐式地获得HUP。但是,如果您担心将一个信号发送给父进程组的整个进程组,则可以通过将子进程拆分成一个单独的进程组来避免这种情况:
在child.
subprocess.Popen
参数start_new_session=True
将子进程从父进程分割成一个单独的组,因此发送给父进程组的父进程作为一个整体不会被signal.signal(signal.SIGHUP, signal.SIG_IGN)
接收--signal.signal(signal.SIGHUP, signal.SIG_IGN)
的preexec_fn
甚至更明确地表明,即使接收到一个signal.signal(signal.SIGHUP, signal.SIG_IGN)
,子进程也应该默认忽略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.SIGHUP, signal.SIG_IGN)))
https://stackoverflow.com/questions/69664260
复制相似问题