subprocess.popen detached from master (Linux)

萝らか妹 提交于 2020-01-02 11:07:34

问题


I am trying to open a subprocess but have it be detached from the parent script that called it. Right now if I call subprocess.popen and the parent script crashes the subprocess dies as well.

I know there are a couple of options for windows but I have not found anything for *nix.

I also don't need to call this using subprocess. All I need is to be able to cal another process detached and get the pid.


回答1:


With linux, it's no issue at all. Just Popen(). For example, here is a little dying_demon.py

#!/usr/bin/python -u
from time import sleep
from subprocess import Popen
print Popen(["python", "-u", "child.py"]).pid
i = 0
while True:
    i += 1
    print "demon: %d" % i
    sleep(1)
    if i == 3:
        i = hurz # exception

spinning off a child.py

#!/usr/bin/python -u
from time import sleep
i = 0
while True:
    i += 1
    print "child: %d" % i
    sleep(1)
    if i == 20:
        break

The child continues to count (to the console), while the demon is dying by exception.




回答2:


I think this should do the trick: https://www.python.org/dev/peps/pep-3143/#reference-implementation

You can create daemon which will call your subprocess, passing detach_process=True.




回答3:


I managed to get it working by doing the following using python-daemon:

process = subprocess.Popen(["python", "-u", "Child.py"])
    time.sleep(2)
    process.kill()

Then in Child.py:

with daemon.DaemonContext():
    print("Child Started")
    time.sleep(30)
    print "Done"
    exit()

I do process.kill() because otherwise it creates a defunct python process. The main problem I have now is that the PID that popen returns does not match the final pid of the process. I can get by this by adding a function in Child.py to update a database with the pid.

Let me know if there is something that I am missing or if this is an ok method of doing this.




回答4:


fork the subprocs using the NOHUP option



来源:https://stackoverflow.com/questions/31482397/subprocess-popen-detached-from-master-linux

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!