Launch a completely independent process Launch a completely independent process python python

Launch a completely independent process


You open your long-running process and keep a pipe to it. So you expect to talk to it. When yor launcher script exits, you can no longer talk to it. The long-running process receives a SIGPIPE and exits.

The following just worked for me (Linux, Python 2.7).

Create a long-running executable:

$ echo "sleep 100" > ~/tmp/sleeper.sh

Run Python REPL:

$ python>>>import subprocessimport osp = subprocess.Popen(['/bin/sh', os.path.expanduser('~/tmp/sleeper.sh')])# look ma, no pipes!print p.pid# prints 29893

Exit the REPL and see the process still running:

>>> ^D$ ps ax | grep sleeper29893 pts/0    S      0:00 /bin/sh .../tmp/sleeper.sh29917 pts/0    S+     0:00 grep --color=auto sleeper

If you want to first communicate to the started process and then leave it alone to run further, you have a few options:

  • Handle SIGPIPE in your long-running process, do not die on it. Live without stdin after the launcher process exits.
  • Pass whatever you wanted using arguments, environment, or a temporary file.
  • If you want bidirectional communication, consider using a named pipe (man mkfifo) or a socket, or writing a proper server.
  • Make the long-running process fork after the initial bi-direcional communication phase is done.


You can use os.fork().

import ospid=os.fork()if pid==0: # new process    os.system("nohup python ./myfile.py &")    exit()# parent process continues


I could not see any process running.

You don't see any process running because the child python process exits immediately. The Popen arguments are incorrect as user4815162342 says in the comment.

To launch a completely independent process, you could use python-daemon package or use systemd/supervisord/etc:

#!/usr/bin/python25import daemonfrom long_process import mainwith daemon.DaemonContext():    main()

Though it might be enough in your case, to start the child with correct Popen arguments:

with open(os.devnull, 'r+b', 0) as DEVNULL:    p = Popen(['/usr/bin/python25', '/path/to/long_process.py'],              stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT, close_fds=True)time.sleep(1) # give it a second to launchif p.poll(): # the process already finished and it has nonzero exit code    sys.exit(p.returncode)

If the child process doesn't require python2.5 then you could use sys.executable instead (to use the same Python version as the parent).

Note: the code closes DEVNULL in the parent without waiting for the child process to finish (it has no effect on the child).