Perlのフォークですが、子プロセスのシステムコールから出口ステータスを取得します

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

  •  25-10-2019
  •  | 
  •  

質問

私がやること:

  1. CGIスクリプトにAJAX呼び出しを行います。
  2. CGIスクリプトフォークですが、親は応答MSGですぐに戻ります。
  3. 子供はシステム呼び出しを行いますが、出口コードとエラーメッセージが必要です。

擬似コード:

$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)、それは親のプロセスに影響しませんよね?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top