Página 1 de 1

Procesos zombies en AIX

NotaPublicado: 2013-05-23 05:59 @291
por pbellon
Intento lanzar procesos en paralelo mediante fork() en un servidor AIX y se quedan procesos zombis. El programa principal no debe finalizar nunca.

¿Cómo puedo evitar estos procesos zombis?
Hasta que no mato el programa principal permanecen.

------------------ PROGRAMA PRINCIPAL --------------------------------------
$interval = 60;
$mifile = "...";

# Cada registro del fichero será del tipo: hh:mm,accion_a_ejecutar

######################################
# M A I N
######################################
while (1){
$hh = sprintf("%02d",(localtime)[2]);
$mm = sprintf("%02d",(localtime)[1]);

# Se procesa las acciones
open F,"$mifile";
while (<F>){
($hora,$accion) = split(",",$_);
if ($hora eq "$hh:$mm"){
my $pid = fork();
if ($pid == 0){
exec "hijo.pl $accion";
exit(0);
}# fin if
}# fin if
}# while
close f;

sleep($interval);
}# while (1)
exit;


--------------- PROCESO HIJO ---------------------------
##############################
# hijo.pl
##############################
$texto = shift(@ARGV);
print "Se ha recibido el texto: $texto\n";
exit 0;

Re: Procesos zombies en AIX

NotaPublicado: 2013-05-23 09:36 @441
por explorer
Según perldoc -f fork:
Código: Seleccionar todo
    fork    ...

            Si usted hace un "fork" sin luego esperar a sus hijos, irá
            acumulando zombis. En algunos sistemas, puede evitar esto
            poniendo $SIG{CHLD} a "IGNORE". Ver también perlipc para más
            ejemplos de fork y borrado de hijos moribundos.

Quizás te sea tan sencillo como lo que dice ahí, para evitar a los zombis.

En perlfork comentan algo de llamar a exec() desde un hijo, diciendo que el PID del proceso llamado por exec() no coincidirá con el PID del proceso hijo. Yo, en vez de poner un exec() seguido de un exit(), lo pondría con un system() seguido de un exit().

En perlipc te comentan todas las opciones para crear procesos hijos, esperar a que mueran (o no), y evitar la zombificación.

Re: Procesos zombies en AIX

NotaPublicado: 2013-05-30 02:35 @149
por pbellon
He probado con

$SIG{CHLD}="IGNORE";

y funciona perfectamente.

Gracias.