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)