2011-01-19 15 views
6

Estoy abriendo un proceso de larga duración con popen(). Para la depuración, me gustaría finalizar el proceso antes de que se complete. Llamar a pclose() solo bloquea hasta que el hijo finalice.¿Procesos de muerte abiertos con popen()?

¿Cómo puedo matar el proceso? No veo ninguna manera fácil de obtener el pid del recurso que popen() devuelve para poder enviarle una señal.

supongo que podría hacer algo kludgey y tratar de eludir el pid en la salida utilizando algún tipo de hackery de línea de comandos ...

+0

Esta no es una respuesta real porque es para C y no para PHP, pero vea este enlace para obtener una sugerencia: http://www.monkey.org/openbsd/archive/misc/0112/msg00360.html –

Respuesta

7

Bueno, aterrizó en una solución: me cambió de nuevo a proc_open() en lugar de popen(). Entonces es tan simple como:

$s = proc_get_status($p); 
posix_kill($s['pid'], SIGKILL); 
proc_close($p); 
+0

Estaba teniendo el mismo problema con 'proc_open()', así que intenté con el más simple 'popen()', esperando que eso ayudara. No me di cuenta, en ese momento, que * tanto * 'pclose()' y 'proc_close()' bloquean hasta que el hijo termina. Una vez que te das cuenta de eso, entonces tienes que matar al niño. Y para matar al niño necesita el pid, y eso no está disponible limpiamente con 'popen()'. 'proc_open()' hace todo 'popen()' hace, y luego algo. –

+0

marque su propia respuesta para que la gente sepa que ha encontrado la solución. – mauris

+0

@thephpdeveloper SO me da un error de "Puedes aceptar tu propia respuesta mañana", ahora mismo. –

0

envíanos un kill (o abortar) de la señal usando la función de muertes:

+0

La parte engañosa está haciendo un buen trabajo averiguando qué pid matar :) Una vez que esté seguro de que tiene el pid correcto, puede llamar a 'posix_kill()' de php. Supongo que, en retrospectiva, podría haber analizado la lista de pids de ps, ya que es fácil encontrar mi propio pid. –

0

puede encontrar el pid, y comprueba que usted es realmente su padre haciendo:

// Find child processes according to current pid 
$res = trim(exec('ps -eo pid,ppid |grep "'.getmypid().'" |head -n2 |tail -n1')); 
if (preg_match('~^(\d+)\s+(\d+)$~', $res, $pid) !== 0 && (int) $pid[2] === getmypid()) 
{ 
    // I'm the parent PID, just send a KILL 
    posix_kill((int) $pid[1], 9); 
} 

Está funcionando muy bien en un servidor PHP-cgi rápido.

Cuestiones relacionadas