我希望在终止原始流程后让流程继续运行。
以下代码在杀死原始代码后不会使其进程继续运行。
args = ['yes']
Popen(args, shell=True, stdout=None, stdin=None, stderror=None)
我已经尝试了所有我能想到的东西,我已经使用了os.spawn()的变体而无法让它们保持开放。
它似乎向子进程发送键盘中断(命令yes)。
答案 0 :(得分:1)
问题在于,即使您的子流程无法通过标准流访问控制台,它仍然会有一个控制终端;进程可以从其控制终端接收诸如TSTP(停止,^ Z)和INT(^ C)的信号。因此,您希望将进程从控制终端和整个会话中分离出来。执行此操作时,您将拥有正确的守护进程。
在C world和Python 2中,您可以通过调用子进程中的setsid
来实现此目的,这将为子进程创建一个新会话。此外,新会话将没有控制终端。
在Python 3.2+中,这更容易 - 只需将start_new_session=True
传递给Popen
:
如果
start_new_session
为真,则在执行子进程之前,将在子进程中进行setsid()
系统调用。 (仅限POSIX)在版本3.2中更改:添加了
start_new_session
。
答案 1 :(得分:1)
如果处理多进程接口看起来太复杂,那么有一个名为“屏幕”的应用程序。大多数Linux发行版都可以使用一次性命令行调用它,它将保持活动状态。它功能齐全,易于互动。
它被称为这样的东西。
#!/usr/bin/python
import subprocess
subprocess.call(["screen", "-S", "session_name", "-X", "stuff", "'command here'`echo -ne '\015'`"])
请记得查看手册页,了解每个选项的功能以及所有可用的功能。
我过去曾使用它在远程服务器上运行监视程序进程。 稍后您可以通过调用屏幕重新连接到会话,如下所示
screen -d -r -S "session_name"
准备好与屏幕进程断开连接并保持活动状态时,在命令行发出以下键序列。
Ctl-a Ctl-d
还要记住列出所有可用命令的命令
Ctl-a ?
如果您想查看所有可用实例,请在屏幕外部使用命令
screen -l
来自here的原始参考
答案 2 :(得分:-2)
尝试禁用关闭终端的命令。