Forking into the background (Linux)

Hans Mulder hansmu at xs4all.nl
Mon Dec 24 02:56:35 CET 2012


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





	



More information about the Python-list mailing list