关闭python后保持进程运行

时间:2018-05-28 20:36:47

标签: python unix fork

我希望在终止原始流程后让流程继续运行。

以下代码在杀死原始代码后不会使其进程继续运行。

args = ['yes']
Popen(args, shell=True, stdout=None, stdin=None, stderror=None)

我已经尝试了所有我能想到的东西,我已经使用了os.spawn()的变体而无法让它们保持开放。

它似乎向子进程发送键盘中断(命令yes)。

3 个答案:

答案 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)

尝试禁用关闭终端的命令。