【问题标题】:Leave a process running after closing python关闭python后让进程运行
【发布时间】:2018-05-28 20:36:46
【问题描述】:

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

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

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

我已经尝试了所有我能想到的方法,我使用了 os.spawn() 的变体,但无法让它们保持打开状态。

好像给子进程发送了一个键盘中断(命令yes)。

【问题讨论】:

  • @DyZ 这没有回答我的问题,正如您在上面看到的,我正在使用 subprocess 模块,但问题仍然存在。
  • 重新打开。 @DyZ 这可能是我今年见过的最严重的打击。

标签: python unix fork


【解决方案1】:

问题在于,即使您的子进程无法通过标准流访问控制台,它仍然会有一个控制终端;一个进程可以从它的控制终端接收到诸如 TSTP(stop, ^Z) 和 INT (^C) 等信号。因此,您想要的是将进程与控制终端和整个会话分离。当您这样做时,您将拥有一个适当的守护进程。

在 C 世界和 Python 2 中,您可以通过在 child 进程中调用 setsid 来实现此目的,这将为子进程创建一个新会话。此外,新会话将没有控制终端。

在 Python 3.2+ 中,这更容易 - 只需将 start_new_session=True 传递给 Popen

如果start_new_session 为真,则setsid() 系统调用将在子进程执行之前在子进程中进行。 (仅限 POSIX)

3.2 版更改:添加了start_new_session

【讨论】:

  • 感谢安蒂!这可以正常工作。另请注意找到此解决方案的其他任何人,如果您使用的是 PyCharm,它会在关闭时自动终止新会话。当我从终端运行它时它可以工作。
  • 我相信 PyCharm 做了一些黑魔法来跟踪它下面运行的任何进程,以便它可以杀死它们。
【解决方案2】:

如果处理多进程接口看起来过于复杂,大多数 Linux 发行版上都有一个名为“screen”的应用程序,您可以使用一次性命令行调用它,它会保持活动状态。它功能齐全且易于交互。

它被称为这样的东西。

#!/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的原始参考

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这个问题的重点是能够关闭终端。使用 python 运行一些命令,结束该进程,python 产生的任何东西都会继续运行。
    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 2015-11-21
    • 1970-01-01
    • 2016-05-21
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多