2008-11-20 21 views
7

¿Cuál es la mejor manera de eliminar un proceso y todos sus procesos secundarios de un script Perl? Debería ejecutarse al menos bajo Linux y Solaris, y no requerir la instalación de ningún paquete adicional.¿Cómo puedo matar un árbol de procesos completo con Perl?

Supongo que obtendría una lista de todos los procesos y sus padres analizando los archivos en/proc o analizando el resultado de ps (ninguno de los cuales parece portátil entre Linux y Solaris); y luego matar todos los procesos en el árbol (que parece propenso a las condiciones de carrera).

Podría vivir con las condiciones de carrera en este caso particular, pero ¿cómo puedo obtener la lista de procesos de forma portátil?

Respuesta

9

Si se puede vivir con matar a un grupo de procesos, se puede utilizar el siguiente:

kill -$signum, $pgid; 

donde $signum es el número de la señal, y $pgid es el identificador de grupo de procesos. Sin embargo, el número de señales no son muy portátiles, en cuyo caso se puede (en algunas plataformas, leer perlfunc para la explicación) haga lo siguiente (para enviar SIGTERM, por ejemplo):

kill 'TERM', -$pgid; 
+0

¿Qué procesos pertenecen a un grupo de procesos? Estoy usando IPC :: Open3 para iniciar un proceso (que en Solaris ejecuta el comando dentro de sh -c), y quiero eliminar el sh y mi comando real y todos los demás subprocesos. ¿Qué sucede si el grupo de procesos contiene incluso el intérprete de Perl? ¿No puede pasar eso? – oliver

+0

Mientras no use SIGKILL, puede hacer que su programa Perl ignore la señal que está enviando. Lea perlipc (busque "grupo de proceso"). –

Cuestiones relacionadas