2011-04-24 20 views
20

Me pregunto si esta es la forma correcta de ejecutar un proceso del sistema y separarlo del padre, aunque permitiendo que el padre salga sin crear un zombie y/o matar al niño proceso. Actualmente estoy usando el módulo de subproceso y hacer esto ...Python genera un subproceso secundario, se separa y sale

os.setsid() 
os.umask(0) 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd=self.home, 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

os.setsid() cambia el grupo de procesos, que creo que es lo que permite que el proceso continúe funcionando cuando está salidas de los padres, ya que ya no se pertenece al mismo grupo de procesos.

¿Es correcto y también es esta una manera confiable de realizar esto?

Básicamente, tengo una utilidad de control remoto que se comunica a través de sockets y permite iniciar procesos de forma remota, pero tengo que asegurarme de que si el control remoto muere, los procesos que inició continúen sin verse afectados.

Estaba leyendo acerca de las horquillas dobles y no estoy seguro si esto es necesario y/o subprocesamos.¿Por qué close_fds de alguna manera se ocupa de eso y todo lo que se necesita es cambiar el grupo de procesos?

Gracias.

Ilya

+0

Eche un vistazo a http://code.activestate.com/recipes/278731-creating-a-daemon-the-python-way/ http://www.python.org/dev/peps/pep- 3143/# reference-implementation – sehe

Respuesta

5

popen en Unix es done using fork. Eso significa que usted estará seguro con:

  1. ejecutar Popen en su proceso padre
  2. salir inmediatamente del proceso padre

Cuando el proceso finalice padres, el proceso hijo se hereda por la init proceso (launchd en OSX) y seguirá ejecutándose en segundo plano.

no son necesarias las dos primeras líneas de su programa de pitón, esto funciona perfectamente:

import os, time 
import subprocess 
p = subprocess.Popen(['nc', '-l', '8888'], 
        cwd="/", 
        stdout=subprocess.PIPE, 
        stderr=subprocess.STDOUT) 

que estaba leyendo acerca dobles horquillas y no estoy seguro si esto es necesario

Este sería necesario si el proceso de los padres sigue en funcionamiento y necesita proteger a sus hijos para que no mueran con los padres. This answer muestra cómo se puede hacer esto.

¿Cómo funciona el doble tenedor:

  1. crear un niño a través de os.fork()
  2. en esta convocatoria niño Popen() que pone en marcha el proceso de larga duración
  3. salida niño: Popen proceso es heredado por init y corre en el fondo

¿Por qué el padre tiene que salir inmediatamente? ¿Qué pasa si no sale de inmediato?

Si deja el elemento primario ejecutándose y el usuario detiene el proceso, p. a través de ctrl-C (SIGINT) o ctrl-\ (SIGQUIT) luego mataría el proceso principal y el proceso Popen.

¿Qué pasa si sale un segundo después de bifurcar?

Luego, durante este período 1s su proceso de Popen es vulnerable a Ctrl-C, etc. Si necesita estar 100% seguro a continuación, utilizar el doble de bifurcación.

+0

¿Puede explicar por qué el padre tiene que salir inmediatamente? ¿Qué pasa si no sale de inmediato? Además, ¿qué constituye como "inmediatamente"? ¿Qué pasa si sale un segundo después de bifurcar? – Hubro

+0

@Hubro: He agregado las respuestas a su pregunta en mi respuesta anterior y también he aclarado algunas cosas que no se explicaron correctamente – hansaplast

+0

Este proceso se cerrará si el proceso secundario coloca una salida grande en la tubería. Establezca 'stdout = None' si no desea comunicarse con el proceso. Para obtener más información, consulte: https://thraxil.org/users/anders/posts/2008/03/13/Subprocess-Hanging-PIPE-is-your-enemy/ –

Cuestiones relacionadas