【问题标题】:Leaving child process running after the parent exits父进程退出后让子进程继续运行
【发布时间】:2015-09-28 23:48:05
【问题描述】:

我想创建一个子进程,它会在父进程完成后运行。

我试过了:

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

子进程已创建,但父进程一直等到子进程完成。 相反,我想快点完成,让孩子在后台做艰苦的工作。有什么建议吗?

一些说明:

  • 它在 Linux (Ububntu Server 14.04) 上运行
  • 最好是python 2.7
  • 我不想以任何方式与孩子交流。孩子是完全独立的过程。

我需要快速完成主进程,因为它将通过网络访问。它旨在触发另一个脚本。结果将稍后发送到电子邮件(由子进程)。因此,用户无需等待答案。只需快速“确定”,然后孩子就开始了。

编辑: 好的。现在说实话,即使是我在这篇文章中的示例也适用于最简单的情况(只是那 2 行 + 休眠 10 秒的脚本 + 写入文件 => 主要完成,我在 10 秒内得到一个文件)。 实际情况要复杂一些。

有一个脚本,它遍历所有必须执行的脚本列表。这个主脚本使用 subprocess.Popen 和communicate() (等待输出)。这调用了我在这里寻求帮助的“主”脚本。这个“主要”做了一些事情,然后想在后台运行一个孩子。在这种情况下,“主要”等待孩子。

我将尝试制作一个简短的清理代码示例。

【问题讨论】:

  • 试试subprocess.Popen(['myscript'], start_new_session=True)
  • @J.F.Sebastian Daemon 在这里可能有点矫枉过正。可悲的是,Ago 没有提到生成的进程是否必须由用户以某种方式进一步控制(停止、暂停、管道输入/输出等)。如果不需要控制并且生成的进程包含执行其操作然后自动进入不存在状态的代码,则您无需执行像创建守护程序那样复杂的操作。 OP 应该提供这些信息,以便我们可以评估在他的情况下什么是最佳解决方案。
  • 应该在评论中提及这一点,而不仅仅是输入“相关”。发布链接而不提供有关其内容的信息以及它与手头问题的关系不是一件好事。

标签: python subprocess parent-child daemon


【解决方案1】:

我认为这会奏效:

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

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

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

【讨论】:

    【解决方案2】:

    如果您使用 Linux,那么一种方法是使用 nohup。请注意,nohup 也会将标准输出重定向到 nohup.out,这可能是不可取的

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

    【讨论】:

      【解决方案3】:

      您可以尝试使用system() (documentation)。类似的东西:

      import os
      os.system('myscript' + ' &')
      

      命令末尾的& 将在后台子shell 中执行它。

      【讨论】:

      • 这也只适用于 Linux 或 Unix。在 Windows 上,使用 start /b myscript
      • 这样我可以结束我的主程序,但“myscript”永远不会运行。
      • @KevinGuan 修补进程管理和 ICP 从一开始就不是多平台的(除非您使用 JVM 等高级抽象)。看看这个article
      • @rbaleksandar 对不起,我的错。
      • @Ago 只是好奇,你是如何验证myscript 运行的?
      【解决方案4】:

      使用下面的 sn-p 会起作用

      import subprocess, os
      subprocess.Popen(['myscript'])
      os._exit(0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-16
        • 1970-01-01
        • 1970-01-01
        • 2018-08-30
        • 1970-01-01
        • 2019-08-05
        • 2020-03-04
        • 1970-01-01
        相关资源
        最近更新 更多