首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从Python脚本运行nohup命令?

如何从Python脚本运行nohup命令?
EN

Stack Overflow用户
提问于 2021-10-21 14:56:50
回答 1查看 2K关注 0票数 0

我有个简单的问题。我试图寻找解决办法,但没有任何答案可以解释我需要什么。

问题是:如何从Python启动nohup命令?基本上,我的想法是,我有一个Python来准备我的环境,我需要它来用nohup命令启动多个脚本。如何从运行中的Python中启动nohup命令(如nohup python3 my_script.py & ),使nohup命令即使在我注销后也能运行?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-21 15:38:36

您不需要nohup --即使在shell中也不需要,在Python中更不需要。它做了以下事情:

nohup.out

  • If

  • 将HUP信号配置为被忽略(很少相关:如果进程在TTY上没有句柄,则不会在TTY退出时得到通知;shell只在交互模式下向子节点传播信号,而不是在运行脚本时)。如果stdout是终端,则将其重定向到redirected.

  • Redirects stdout为/dev/null

的任何位置。

就这样。没有理由使用nohup来做任何这些事情;没有它,它们都是微不足道的:

  • </dev/null在shell中将stdin从/dev/null重定向;stdin=subprocess.DEVNULL在Python.
  • >nohup.out中将stdout重定向到shell中的nohup.outstdout=open('nohup.out', 'w')在Python.
  • 2>&1中将stderr重定向到与shell中的stdout相同的位置;stderr=subprocess.STDOUT在Python.
  • 2>&1中这样做。

因为您的进程没有通过上面的重定向连接到终端,所以当该终端关闭时,它不会隐式地获得HUP。但是,如果您担心将一个信号发送给父进程组的整个进程组,则可以通过将子进程拆分成一个单独的进程组来避免这种情况:

在child.

  • Adding中,
  • 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的文件--我建议您选择一个更好的名称):

代码语言:javascript
运行
复制
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)))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69664260

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档