3

作成したスクリプトに問題があります。スクリプトをデーモンのように実行したいので、シグナルを使用するのはこれが初めてです。そのため、いくつかのシグナル Handler を設定して、スクリプトを適切に終了させます。

local $SIG{HUP} = \&StopSuperviser;
local $SIG{INT} = \&StopSuperviser;
local $SIG{QUIT} = \&StopSuperviser;
local $SIG{ILL} = \&StopSuperviser;
local $SIG{ABRT} = \&StopSuperviser;
local $SIG{TERM} = \&StopSuperviser;

これは正常に動作していますが、これらの信号の 1 つ (Crt-C、kill -15、kill -1 ...) をスクリプトに送信すると、StopSuperviser 関数は正しく呼び出されますが、スクリプトの出力で常に次のエラーが表示されます。

グローバル破棄中の null 操作で、引数 "HUP" が数値ではありません。

Google で検索しましたが、この動作を扱っているものは見つかりませんでした。

誰かがこれに光を当てることができますか?

どうもありがとうございました。

よろしくお願いします

フロラン

#

返信ありがとうございます。StopSuperviser 関数は次のとおりです。

sub StopSuperviser
{
    print "On quite\n";
    $StopAlarm = 1;
    &DeleteThreadOrder($AllProcess);
    foreach my $Subprocess (@$AllProcess) {
        foreach my $thread (@{$Subprocess->{Thread}}) {
            $thread->kill('USR1');
            $thread->join();
        }
    }
    exit;
}

次のパッケージも使用します。

use Alarm::Concurrent;

これは知っておくことが重要かもしれませんし、そうでないかもしれません:) この助けを願っています:)

あなたの応答と助けに再び感謝します

よろしくお願いします

フロラン

4

1 に答える 1

0

今年の初めにこの問題が発生し、PerlMonks で解決策を見つけることになりましたが、現在はリンクが見つかりません。見つけたら更新します。彼らの説明は、私がここで提示したものよりもはるかに詳細でした.

これは、perlsub で説明されている機能の表現です:

サブルーチンが & 形式を使用して呼び出される場合、引数リストはオプションであり、省略された場合、サブルーチンに対して @_ 配列は設定されません: 代わりに、呼び出し時の @_ 配列がサブルーチンに表示されます。

メモリが機能する場合は、次のように変更することで修正できるはずです。

local $SIG{HUP} = \&StopSuperviser;

local $SIG{HUP} = sub { StopSuperviser() };
于 2012-11-20T21:49:38.260 に答える