3

私がやること:

  1. cgiスクリプトへのajax呼び出しを行います。
  2. Cgiスクリプトはフォークしますが、親はすぐに応答メッセージを返します。
  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} ='IGNORE')が原因で-1に設定されているため、qx()から正しいリターンコード($?)とエラーメッセージを取得する際に問題が発生しました。$ SIG {CHLD}ステートメントを削除すると、子が刈り取られるまで、クライアントWebページは親から応答メッセージを受信しません。

4

2 に答える 2

6

$SIG{CHLD}に設定しているため、-1になります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(たとえば)へのフルパスを使用していることを確認してください。ただし、tarファイルが作成されていないことについては何も言わなかったので、それで問題ないと思います。/bin/tar/bin

于 2011-04-28T07:05:59.393 に答える
2

子セクション(つまり後)でリセット$SIG{CHLD}した場合、親プロセスには影響しませんよね?undef$pid == 0

于 2011-04-28T05:54:16.667 に答える