【问题标题】:Call a python subprocess as daemon and exit调用 python 子进程作为守护进程并退出
【发布时间】:2012-02-15 09:22:14
【问题描述】:

我正在使用一对 python 程序,其中一个应该调用第二个。

但这应该通过第一个程序使第二个程序成为守护进程(或在后台进程中运行)然后退出,而不等待第二个程序结束的方式来完成。

这在 Python 中可行吗?

我一直在查看 os.fork,子进程模块,但我很困惑实现这一目标的正确方法......

【问题讨论】:

    标签: python daemon python-2.x


    【解决方案1】:

    您可以为此使用subprocess.Popen

    import subprocess
    
    cmd = ['/usr/bin/python', '/path/to/my/second/pythonscript.py']
    subprocess.Popen(cmd)
    

    您可能希望将stdoutstderr 重定向到某个地方,您可以通过将stdout=<file_obj> 传递给Popen 构造函数来实现。

    【讨论】:

    • 所以,根据这个,'daemon_process'应该等于'/usr/bin/pyton /path/to/my/second/pythonscript.py'?
    • @JavierNovoaC。 Popen 接受参数列表。我将编辑我的答案以澄清。
    • 我可以补充一下这个问题(这对我来说非常有用),可以通过使用subprocess.Popen(cmd, stdout=sys.stdout, stderr=sys.stderr 获得实时输出)?谢谢。
    • 这是 Python 2 吗?我无法让它在 Python 3.7.8 中工作(并将 stdout/stderr 发送到 devnull)。到目前为止,守护进程似乎非常困难。
    【解决方案2】:

    “守护进程”具有比“后台进程”更具体的定义。默认情况下,Popen 将执行一个子进程并将控制权交还给您的程序以继续运行。但是,这并没有说明处理信号(特别是 SIGHUP,如果用户在后台进程完成之前退出他们的 shell)或断开与您调用 Popen 时打开的标准输入、标准错误、标准输出和任何其他文件描述符的连接。 如果你真的想要一个守护进程,你应该使用 python-daemon 模块,这是 PEP 3143 的一个实现。这会处理你不想考虑的粗略部分。

    【讨论】:

      猜你喜欢
      • 2023-03-02
      • 2012-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      相关资源
      最近更新 更多