父进程退出后保留子进程的运行

4
我希望创建一个子进程,在父进程完成后运行。
我尝试过以下方法:
subprocess.Popen(['myscript'])
exit()

孩子已经创建了,但是父进程要等到孩子完成才结束。相反,我想快速完成并让孩子在后台完成艰苦的工作。有什么建议吗?
一些澄清:
- 它运行在Linux上(Ububntu Server 14.04) - 最好使用Python 2.7 - 我不想以任何方式与孩子进行通信。孩子是完全独立的进程。
我需要主进程快速完成,因为它将被从Web访问。它的目的是触发另一个脚本。结果稍后将通过电子邮件发送(由子进程)。所以,用户无需等待答案。只需快速“OK”,然后孩子开始。
编辑: 好吧。现在坦率地说,即使是我在这篇文章中的示例都在最简单的情况下工作(只有那两行+睡眠10秒钟+写文件的脚本=>主进程完成并且我在10秒钟内得到一个文件)。 实际情况略微复杂。
有一个脚本,它迭代执行一个脚本列表。这个主要脚本使用subprocess.Popen和communicate()(等待输出)。这调用我在这里寻求帮助的“主”脚本。这个“主”做一些事情,然后想在后台运行一个子进程。在这种情况下,“主”等待孩子。

尝试使用subprocess.Popen(['myscript'], start_new_session=True) - multivac
1
@J.F.Sebastian Daemon 在这里可能有点过头了。不幸的是,Ago 没有提到用户是否需要进一步控制生成的进程(停止、暂停、管道输入/输出等)。如果不需要控制,并且生成的进程包含代码,可以自动执行其任务,然后自动转到不存在的状态,则无需创建守护程序这样复杂的操作。OP 应该提供这些信息,以便我们可以评估在他的情况下什么是最优解。 - rbaleksandar
应该在注释中提到这一点,而不仅仅是输入“相关”。发布链接而不提供有关其内容以及如何与手头的问题相关的信息是不好的做法。 - rbaleksandar
4个回答

1
我认为这会有效:

import os  
os.spawnl(os.P_NOWAIT, 'myscript')

如果你只想在Linux上运行子进程,这里有另一种使用GNU程序nohup的方法:

subprocess.Popen(['nohup '+'myscript'+' &'])
# or use os.system()

0

如果您使用Linux,则可以使用nohup的一种方法。请注意,nohup还会将标准输出重定向到可能不需要的nohup.out中。

subprocess.Popen(['nohup', 'myscript'])
exit()

0
你可以尝试使用system()(文档)。类似这样的代码:
import os
os.system('myscript' + ' &')

在命令的末尾加上&符号,将会在子shell中以后台方式执行该命令。


这也只能在Linux或Unix上运行。在Windows上,请使用start /b myscript - Remi Guan
我可以用这个来结束我的主程序,但是“myscript”从未运行。 - Ago
@rbaleksandar 对不起,是我的错。 - Remi Guan
@Ago 只是好奇,你是如何验证 myscript 已经运行了呢? - sh4nkc
@sasankc 我正在写入一个文件。 - Ago
显示剩余4条评论

0
请使用以下代码片段,它将起作用。
import subprocess, os
subprocess.Popen(['myscript'])
os._exit(0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接