2010-06-13 24 views
13

Quiero que un script inicie un nuevo proceso, de modo que el nuevo proceso continúe ejecutándose después de que el script inicial haya finalizado. Esperaba poder usar multiprocessing.Process para comenzar un nuevo proceso y establecer daemon=True para que la secuencia de comandos principal pueda salir mientras el proceso creado continúa ejecutándose.Iniciar un proceso por separado

Pero parece que el segundo proceso finaliza de forma silenciosa cuando sale la secuencia de comandos principal. ¿Es este comportamiento esperado, o estoy haciendo algo mal?

Respuesta

12

De la documentación de Python:

Cuando un proceso sale, intenta terminar todos los procesos de niño daemonic .

Este es el comportamiento esperado.

+2

Gracias, al parecer, no me acerqué lo suficiente al RTFM. – JacquesB

8

Si usted está en un sistema UNIX, puede utilizar os.fork:

import os 
import time 

pid=os.fork() 
if pid: 
    # parent 
    while True: 
     print("I'm the parent") 
     time.sleep(0.5)  
else: 
    # child 
    while True: 
     print("I'm just a child") 
     time.sleep(0.5) 

La ejecución de este crea dos procesos. Puedes matar al padre sin matar al niño. Por ejemplo, al ejecutar secuencia de comandos que veremos algo como:

% script.py 
I'm the parent 
I'm just a child 
I'm the parent 
I'm just a child 
... 

Detener el guión con ctrl-Z:

^Z 
[1]+ Stopped     script.py 

Encuentra el número identificador de proceso para los padres. Será el menor de los dos números de identificación de proceso, ya que el padre fue primero:

% ps axuw | grep script.py 
unutbu 6826 0.1 0.1 33792 6388 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py 
unutbu 6827 0.0 0.1 33792 4352 pts/24 T 15:09 0:00 python /home/unutbu/pybin/script.py 
unutbu 6832 0.0 0.0 17472 952 pts/24 S+ 15:09 0:00 grep --color=auto script.py 

Mata al proceso padre:

% kill 6826 

Restaurar script.py al primer plano:

% fg 
script.py 
Terminated 

Verá que el proceso hijo todavía se está ejecutando:

% I'm just a child 
I'm just a child 
I'm just a child 
... 

matar al niño (en una nueva terminal) con

% kill 6827 
+0

"Puedes matar al padre sin matar al niño". ¿Cómo? –

+0

@MartinThoma: Agregué detalles sobre cómo hacer eso desde la terminal de arriba. Muchos sistemas operativos tienen un monitor de proceso GUI que puede hacer esto aún más fácil, pero esos detalles serían específicos de OS/GUI. – unutbu

7

Simplemente use el módulo subprocess:

import subprocess 
subprocess.Popen(["sleep", "60"]) 
Cuestiones relacionadas