How do I start a process (another Python script, for example) from a Python script so the “child” process is completely detached from the “parent”, so the parent can a) continue on its merry way without waiting for child to finish and b) can be terminated without terminating the child process?
import os print "Parent started" os.system("./child.py") print "Parent finished"
import time print "Child started" time.sleep(10) print "Child finished"
Parent started Child started Child finished Parent finished
What I want it to print:
Parent started Child started Parent finished (seconds later) Child finished
Since you mentioned
os.system, I think it’s worth to mention that you should have used
os.spawn* with mode
P_NOWAIT to achieve the “forget” part.
subprocess module provides replacements for
os,spawn*,etc so you should use that instead like so
import subprocess p = subprocess.Popen("./child.py") print "pid = ", p.pid
See Replacing os.spawn with subprocess.Popen
As I explained in the comments both processes
child.py are still on the same process group and therefore the terminal will forward signals (like
Ctrl-C) to all process in the foreground process group so both will get killed when you
Ctrl-C. So if you don’t want that you can force
child.py to be in a new process group with the following:
#!/usr/bin/env python import subprocess import time import os p = subprocess.Popen("./child.py", preexec_fn=os.setsid) print "pid = ", p.pid time.sleep(30) # Ctrl-C at this point will not kill child.py print "parent exit"