Bifurca en Perl, pero obtenga el estado de salida de una llamada del sistema en el proceso infantil

StackOverflow https://stackoverflow.com/questions/5813312

  •  25-10-2019
  •  | 
  •  

Pregunta

Lo que hago:

  1. Haga una llamada Ajax a un script CGI.
  2. CGI Script bifurca pero el padre regresa de inmediato con un mensaje de respuesta.
  3. El niño hace una llamada del sistema pero necesita el código de salida y cualquier mensaje de error.

Pseudo-código:

$SIG{CHLD} = ‘IGNORE’; # or waitpid($pid,0) in the parent process
$pid = fork();
if($pid == 0)
{
    close STDOUT; # So that the parent sends the response to the client right away.

    @errorMsgs = qx(tar up big directories over 50G…); # This can go on for a few minutes.

    if($? ==0) { Send a ‘success’ email } # Is always false ($? == -1)

    else { Send a ‘failure’ email }
}
elsif($pid){ sendResponse; waitpid($pid,0) if $SIG{CHLD} != 'IGNORE'; exit;}

Mi problema:

Problemas para obtener un código de retorno correcto ($?) Y cualquier mensaje de error de Qx (), ya que está configurado en -1 debido a ($ SIG {chld} = 'ignorar'). Si elimino la declaración $ sig {chld}, la página web del cliente no recibe un mensaje de respuesta del padre hasta después de que se coseche el niño.

¿Fue útil?

Solución

Estás obteniendo un -1 porque estás configurando $SIG{CHLD} a IGNORE. Al hacer eso, estás matando qxLa capacidad de capturar el código de salida de tar... Morirá sin notificar al padre (el proceso de su hijo).

Es lo suficientemente simple como para probar:

perl -e '$SIG{CHLD} = "IGNORE"; system("ps"); print "Finished with $?\n";

Esto da -1.

perl -e 'system("ps"); print "Finished with $?\n";

Esto da 0.

Si realmente necesitas el $SIG{CHLD} = 'IGNORE', entonces solo $SIG{CHLD} = 'DEFAULT' antes de su qx llamar.

Además, asegúrese de estar usando el camino completo para tar (p.ej /bin/tar) en caso de que no tengas /bin en su camino, y no se ejecuta. Sin embargo, supongo que está bien ya que no dijiste nada sobre que no se creara tu archivo de alquitrán.

Otros consejos

Bueno, si te reinicias $SIG{CHLD} a undef en la sección del niño (es decir, después $pid == 0), no afectará el proceso principal, ¿verdad?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top