usar script programa otro interprete ejecutar desde cómo compilar como archivo python subprocess nohup

otro - Ejecute un programa desde Python y haga que continúe ejecutándose después de que se haya matado el script



ejecutar un archivo python en la terminal ubuntu (3)

He intentado ejecutar cosas como esta:

subprocess.Popen([''nohup'', ''my_command''], stdout=open(''/dev/null'', ''w''), stderr=open(''logfile.log'', ''a''))

Esto funciona si el script principal sale con elegancia, pero si elimino el script (Ctrl-C), todos los procesos de mi hijo también se eliminan. Hay alguna manera de evitar esto?

Las plataformas que me interesan son OS X y Linux, usando Python 2.6 y Python 2.7.


Ejecute el subproceso.Popen () en un hilo separado.


El proceso secundario recibe el mismo SIGINT que su proceso primario porque está en el mismo grupo de procesos. Puede poner al niño en su propio grupo de proceso llamando a os.setpgrp () en el proceso secundario. El argumento preexec_fn de Popen es útil aquí:

subprocess.Popen([''nohup'', ''my_command''], stdout=open(''/dev/null'', ''w''), stderr=open(''logfile.log'', ''a''), preexec_fn=os.setpgrp )

(preexec_fn es para un * x-oids solamente. Parece que hay un equivalente aproximado para Windows "creationflags = CREATE_NEW_PROCESS_GROUP", pero nunca lo he probado).


La forma habitual de hacer esto en sistemas Unix es bifurcar y salir si eres el padre. Eche un vistazo a os.fork() . Puede echar un vistazo here para obtener más información.

Aquí hay una función que hace el trabajo:

def spawnDaemon(func): # do the UNIX double-fork magic, see Stevens'' "Advanced # Programming in the UNIX Environment" for details (ISBN 0201563177) try: pid = os.fork() if pid > 0: # parent process, return and keep running return except OSError, e: print >>sys.stderr, "fork #1 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) os.setsid() # do second fork try: pid = os.fork() if pid > 0: # exit from second parent sys.exit(0) except OSError, e: print >>sys.stderr, "fork #2 failed: %d (%s)" % (e.errno, e.strerror) sys.exit(1) # do stuff func() # all done os._exit(os.EX_OK)