Gabel in Perl, erhalten Sie jedoch einen Ausstiegsstatus von einem Systemaufruf im untergeordneten Prozess

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

  •  25-10-2019
  •  | 
  •  

Frage

Was ich mache:

  1. Machen Sie einen Ajax -Anruf zu einem CGI -Skript.
  2. CGI -Skriptgabeln, aber der Elternteil kehrt sofort mit einer Antwort -MSG zurück.
  3. Das Kind nimmt einen Systemaufruf durch, benötigt jedoch den Ausgangscode und alle Fehlermeldungen.

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

Mein Problem:

Probleme beim Erhalten eines korrekten Rückgabecodes ($?) Und Fehlermeldungen von QX (), wie er aufgrund von ($ sig {chld} = 'ignore') auf -1 gesetzt ist. Wenn ich $ sig {chld} Anweisung entferne, erhält die Client -Webseite erst nach dem erneuten Kind eine Antwort -MSG vom übergeordneten übergeordneten.

War es hilfreich?

Lösung

Sie erhalten eine -1, weil Sie einstellen $SIG{CHLD} zu IGNORE. Auf diese Weise töten Sie qxDie Fähigkeit, den Exit -Code von zu erfassen tar... Es wird sterben, ohne den Elternteil zu benachrichtigen (Ihr Kindsprozess).

Es ist einfach genug zu testen:

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

Dies gibt -1.

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

Dies gibt 0.

Wenn Sie das wirklich brauchen $SIG{CHLD} = 'IGNORE', dann einfach $SIG{CHLD} = 'DEFAULT' vor deinem qx Anruf.

Stellen Sie außerdem sicher, dass Sie den vollständigen Pfad zu verwenden tar (z.B /bin/tar) Nur für den Fall, dass Sie nicht haben /bin Auf Ihrem Weg, und es kann nicht ausgeführt werden. Ich gehe jedoch davon aus, dass das in Ordnung ist, da Sie nichts über Ihre TAR -Datei gesagt haben, die nicht erstellt wird.

Andere Tipps

Nun, wenn Sie zurücksetzen $SIG{CHLD} zu undef im Kinderbereich (dh danach $pid == 0)), es hat keinen Einfluss auf den übergeordneten Prozess, oder?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top