Perlのフォークですが、子プロセスのシステムコールから出口ステータスを取得します
質問
私がやること:
- CGIスクリプトにAJAX呼び出しを行います。
- CGIスクリプトフォークですが、親は応答MSGですぐに戻ります。
- 子供はシステム呼び出しを行いますが、出口コードとエラーメッセージが必要です。
擬似コード:
$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;}
私の問題:
($ sig {chld} = 'agnore')により、正しい返品コード($?)とqx()から-1に設定されているため、qx()からのエラーメッセージの取得に問題があります。 $ sig {chld}ステートメントを削除した場合、クライアントWebページは、子供が刈り取られるまで親から応答MSGを受信しません。
解決
設定しているので-1が取得されています $SIG{CHLD}
に IGNORE
. 。それをすることで、あなたは殺しています qx
の出口コードをキャプチャする能力 tar
...それは親(あなたの子供のプロセス)に通知することなく死にます。
テストするのに十分なほど簡単です:
perl -e '$SIG{CHLD} = "IGNORE"; system("ps"); print "Finished with $?\n";
これは-1を与えます。
perl -e 'system("ps"); print "Finished with $?\n";
これは0を与えます。
本当に必要な場合 $SIG{CHLD} = 'IGNORE'
, 、次に $SIG{CHLD} = 'DEFAULT'
あなたの前に qx
電話。
また、フルパスを使用していることを確認してください tar
(例えば /bin/tar
)あなたが持っていない場合に備えて /bin
あなたの道で、それは実行に失敗しています。ただし、Tarファイルが作成されていないことについて何も言わなかったので、それは大丈夫だと思います。
他のヒント
まあ、リセットする場合 $SIG{CHLD}
に undef
子のセクション(つまり、 $pid == 0
)、それは親のプロセスに影響しませんよね?
所属していません StackOverflow