Python cannot detach a process when it is running. How to close the background process and exit without waiting?

I started with a simple test:

cat foo2.py #!/usr/bin/python import subprocess, sys, os def alert(): subprocess.Popen ("xterm &", shell=True, stdin=None, stdout=None, stderr=None, close_fds=True) if __name__ == "__main__": print "hello" alert () os._exit (0) 

When I run this code on the command line regularly, it works:

 ./foo2.py 

returns a unix prompt, and xterm is running in the background.

However, when I run this code with tee

 ./foo2.py | tee my.log 

I don't get a unix prompt until I close xterm.

How can I get a python script to exit but keep xterm in the background?

I saw: Python spawns a child subprocess, disconnects and exits, and the activestate recipe mentioned there. I used this code to create a simple test pattern that simply opens xterm in the background:

 cat foo.py #!/usr/bin/python import subprocess, sys, os def alert(): subprocess.Popen ("xterm &", shell=True, stdin=None, stdout=None, stderr=None) def createDaemon(): """Detach a process from the controlling terminal and run it in the background as a daemon. """ try: pid = os.fork() # Fork a first child. except OSError, e: raise Exception, "%s [%d]" % (e.strerror, e.errno) if (pid == 0): # The first child. os.setsid() try: pid = os.fork() # Fork a second child. except OSError, e: raise Exception, "%s [%d]" % (e.strerror, e.errno) if (pid == 0): # The second child. alert () else: os._exit(0) # Exit parent (the first child) of the second child. else: os._exit(0) # Exit parent of the first child. # Close all open file descriptors. This prevents the child from keeping import resource # Resource usage information. maxfd = resource.getrlimit(resource.RLIMIT_NOFILE)[1] if (maxfd == resource.RLIM_INFINITY): maxfd = 1024 # Iterate through and close all file descriptors. for fd in range(0, maxfd): try: os.close(fd) except OSError: # ERROR, fd wasn't open to begin with (ignored) pass os.open(REDIRECT_TO, os.O_RDWR) # standard input (0) os.dup2(0, 1) # standard output (1) os.dup2(0, 2) # standard error (2) return(0) if __name__ == "__main__": print "hello" retCode = createDaemon() sys.exit (0) 

When I run this code on the command line regularly, it works:

 ./foo.py 

returns a unix prompt, and xterm is running in the background.

However, when I run this code with tee

 ./foo.py | tee my.log 

I don't get a unix prompt until I close xterm.

How can I get a python script to exit but keep xterm in the background?

+4
source share
1 answer

Run nohup xterm & (so that the process is decoupled)

0
source

All Articles