2012-05-21 12 views
9

Solo me pregunto si alguien podría ayudarme. El problema que estoy teniendo es que yo os.fork() obtenga varios bits de información y los envíe a un archivo, pero verificando si el proceso de fork no está funcionando.Python comprobando si un proceso de fork() está terminado

import sys 
import time 
import os 
import re 


ADDRESS = argv[1] 
sendBytes = argv[2] 


proID2 = os.fork() 
if proID2 == 0: 
    os.system('ping -c 20 ' + ADDRESS + ' > testStuff2.txt') 
    os._exit(0) 

print proID2 

finn = True 
while finn == True: 
time.sleep(1) 
finn = os.path.exists("/proc/" + str(proID2)) 
print os.path.exists("/proc/" + str(proID2)) 
print 'eeup out of it ' + str(proID2) 

Creo que os.path.exists() es quizás no lo correcto.

Gracias.

+1

Verificar la existencia de/proc/###/no es una buena solución. Cómo los PID son problemas no está definido. Después de que su hijo termine, el siguiente proceso iniciado (que puede ser totalmente independiente de su aplicación) * puede * obtener el mismo PID. Normalmente, se emiten en un cambio de tendencia, por lo que con kernels actuales su solución funcionará muy probablemente todo el tiempo, pero no puede estar seguro acerca de futuras versiones de kernel o en casos especiales como cuando pone la computadora en modo de suspensión, o en caso de que su la aplicación se está estancando por bastante tiempo debido al retraso de la red, un servidor que no responde o similar. – Alfe

Respuesta

12

Para esperar a que finalice el proceso hijo, use una de las funciones os.waitXXX(), como os.waitpid(). Este método es confiable; como una bonificación, le dará la información de estado.

8

Si bien puede usar os.fork() y os.wait() (vea a continuación un ejemplo), probablemente sea mejor que use métodos del módulo subprocess.

import os, sys 

child_pid = os.fork() 
if child_pid == 0: 
    # child process 
    os.system('ping -c 20 www.google.com >/tmp/ping.out') 
    sys.exit(0) 

print "In the parent, child pid is %d" % child_pid 
#pid, status = os.wait() 
pid, status = os.waitpid(child_pid, 0) 
print "wait returned, pid = %d, status = %d" % (pid, status) 
Cuestiones relacionadas