On 24/12/12 01:50:24, Olive wrote: > My goal is to write a script that 1) write something to stdout; then > fork into the background, closing the stdout (and stderr, stdin) pipe. > > I have found this answer (forking -> setsid -> forking) > http://stackoverflow.com/a/3356154 > > However the standard output of the child is still connected to the > terminal. I would like that if we execute a subprocess.checkprocess on > this program, only "I would like to see this" is captured and that the > program terminates when the parent exits. > > #! /usr/bin/python2 > import os,sys,time > > print "I would like to see this" > pid = os.fork() > if (pid == 0): # The first child. > # os.chdir("/") > os.setsid() > # os.umask(0) > pid2 = os.fork() > if (pid2 == 0): # Second child > print "I would like not see this" > time.sleep(5) > else: > sys.exit() #First child exists > else: # Parent Code > sys.exit() # Parent exists
You could do this before forking: sys.stdin.close() sys.stdin = open('/dev/null', 'r') sys.stdout.close() sys.stdout = open('/dev/null', 'w') sys.stderr.close() sys.stderr = open('/dev/null', 'w') You may want to look at the python-daemon module on Pypy, which appears to do what you need, including some features you haven't asked for, yet. Hope this helps, -- HansM -- http://mail.python.org/mailman/listinfo/python-list