0

リモートホストをセットアップするための perl スクリプトがあります。これは、何か問題が発生した場合の割り込みハンドラーです。

sub interrupt
{
    $SIG{'__DIE__'} = '';
    my $signal = shift;
    print STDERR "Error $SELF_NAME: Bootstrapping of host '$REMOTE_HOST' is interrupted with error '$signal', deleting remote temporary directory $REMOTE_TEMP_DIR.\n";
    remote_exec("perl -e \"use File::Path; rmtree('$REMOTE_TEMP_DIR');\"", $REMOTE_HOST, $REMOTE_EXEC_METHOD, $REMOTE_EXEC_PORT, $USERNAME, $PASSWORD, 0, 1);
    exit 1;
}

そして、このハンドラーは、必要なときに常に呼び出されます。だから私は中断されたブートストラップに関するエラーを見ることができますSTDERR. しかしexit 1;は呼び出されず、スクリプトは で戻りますexit_code = 0しかしprint STDERR "After remote_exec and before exit";、この行をハンドラーの最後の 2 行の間に追加すると、正常に動作します (つまり、 で戻りますexit_code = 1)。

注:ローカルホストでテストしているので、内部remote_execで呼び出すだけです。system($COMMAND)

アップデート

スクリプトの呼び出し方法に関する詳細を追加します。

標準ログを追跡し、終了ステータスをチェックする C++ プログラムからスクリプトを実行します。終了ステータスが0でない場合は、エラーが出力されます。そのため、スクリプトに余分な行を追加するexitsystem、C++ プログラムが出力するエラーが表示されますが、そのような余分な行がない場合、C++ プログラムはスクリプトが正常に終了したことを通知します。つまり、終了ステータスは0です。

4

1 に答える 1

0

あなたは実際に問題を示していなかったので、私はそれを示す方法を推測しなければならず、失敗しました。

$ perl -e'
   sub interrupt {
      $SIG{"__DIE__"} = "";
      my $signal = shift;
      print STDERR "...\n";
      system("echo ...");
      exit 4;
   }
   $SIG{INT} = \&interrupt;
   <>;
'
^C...
...

$ echo $?
4

(4 を使用したのは、1 よりも特徴的なためです。)

「呼ばれない」とはどういう意味ですか?割り込みの結果としてプログラムが終了したことを示しているようです。つまり、プログラムが呼び出されたことを意味します。

于 2013-03-15T07:33:57.067 に答える