2

私は非常に単純な perl スクリプトを持っています。これは、1 つの関数で次のことを行います。

    if ( legato_is_up() ) {
        write_log("INFO:        Legato is up and running. Continue the installation.");
        $wait_minutes = $WAITPERIOD + 1;
        $legato_up = 1;
    }
    else {
        my $towait = $WAITPERIOD - $wait_minutes;
        write_log("INFO:        Legato is not up yet. Waiting for another $towait minutes...");
        sleep 30;
        $wait_minutes = $wait_minutes + 0.5;
    }

何らかの理由で、スクリプトが強制終了されることがあります (3 回に 1 回の実行など)。誰が殺しの責任を負っているのかはわかりませんが、「スリープ」コール中に発生したことだけはわかっています。

ここでヒントを教えてもらえますか?スクリプトが強制終了された後、その仕事は完了していません。これは大きな問題です。

ありがとう。

4

1 に答える 1

1

システムで他に何が実行されているかを知らなくても、それは誰にも推測できません。シグナル ハンドラーを追加することもできますが、それが伝えるのは、それがどのシグナルだったか (およびいつ) かだけで、誰がそれを送信したかはわかりません。

foreach my $signal (qw(INT PIPE HUP))
{
    my $old_handler = $SIG{$signal};
    $SIG{$signal} = sub {
        print time, ": ", $signal, " received!\n";
        $old_handler->(@_) if $old_handler;
    };
}

stderr からの出力をログに記録しない場合は、WARN および DIE ハンドラーの追加を検討することもできます。

于 2010-07-15T19:58:49.230 に答える