Forking into the background (Linux)

O

Olive

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
 
H

Hans Mulder

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Similar Threads


Members online

Forum statistics

Threads
473,969
Messages
2,570,161
Members
46,708
Latest member
SherleneF1

Latest Threads

Top