Fourchette en perl mais obtenir l'état de sortie d'un appel système dans le processus de l'enfant

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

  •  25-10-2019
  •  | 
  •  

Question

Qu'est-ce que je fais:

  1. un appel ajax à un script cgi.
  2. fourchettes de script cgi, mais les rendements des parents tout de suite avec un msg de réponse.
  3. L'enfant fait un appel système, mais a besoin du code de sortie et les messages d'erreur.

Pseudo-code:

$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;}

Mon problème:

difficulté à obtenir un code de retour correct ($?) Et les messages d'erreur de qx () comme il est défini à -1 en raison de (SIG $ {} CHLD = 'IGNORE'). Si je retire $ SIG {déclaration CHLD}, la page Web client ne reçoit pas un msg du parent de réponse jusqu'à ce que l'enfant est moissonnée.

Était-ce utile?

La solution

Vous obtenez un -1 parce que vous configurez $SIG{CHLD} à IGNORE. En faisant cela, vous tuez la capacité de qx pour capturer le code de sortie de tar ... il va mourir sans en avertir le parent (votre processus enfant).

Il est assez simple pour tester:

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

Cela donne -1.

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

Cela donne 0.

Si vous avez vraiment besoin $SIG{CHLD} = 'IGNORE', puis juste $SIG{CHLD} = 'DEFAULT' avant votre appel qx.

De plus, assurez-vous que vous utilisez le chemin complet vers tar (par exemple /bin/tar) juste au cas où vous n'avez pas /bin dans votre chemin, et il ne pas exécuter. Cependant, je suppose que ce OK, puisque vous ne dit rien au sujet de votre fichier tar pas créé.

Autres conseils

Eh bien, si vous rétablissez $SIG{CHLD} à undef dans la section des enfants (à savoir après $pid == 0), il ne sera pas affecter le processus parent, non?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top