1

radius 認証スクリプトを置き換える必要がありました (PPPoE 接続用)。これは 24 時間年中無休で実行される頻繁に使用されるサービスであるため、新しいスクリプトをテストするために、元のスクリプトの先頭に小さなコードを挿入して、新しいスクリプトを呼び出す新しいプロセスを fork しました (新しいスクリプトが実行された場合に何かが壊れる危険はありません)。スクリプトは失敗します)。挿入されたコードは次のとおりです。

$pid =  fork();
if($pid == 0)
{
    my $now_string = POSIX::strftime "%a %b %e %H:%M:%S %Y", localtime;
    open(FILE,">>/new_log_file.log");
    `/new_script_path/new_script.pl @ARGV`;
    if ($? == 0)
    {
        print FILE "[".$now_string."] Chiled executed succesfuly\n";
    } elsif($? == -1)
    {
        print FILE "[".$now_string."] FAILED to execute\n";
    } elsif($? & 127)
    {
       printf FILE "[".$now_string."] child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without';
    } else
    {
       printf FILE "[".$now_string."] child exited with value %d\n", $? >> 8;
    }
    close(FILE);
    exit;
}

残念ながら、これは新しいスクリプトの実行に失敗し、ログ ファイルに次のメッセージがありました。

"[Mon Feb 27 09:25:10 2012] child exited with value 5"

ビットをシフトせずに、$? の値を は 1280 です。

手動で呼び出すと、新しいスクリプトは期待どおりに機能します。

ステータスコード 5 は何を意味しますか? バックティックでコマンドをデバッグして、何が問題なのかを調べるにはどうすればよいですか?

4

1 に答える 1

2

多くの検索の後、最終的にデバッグする方法を見つけました。新しいコードを見てください:

my $now_string = POSIX::strftime "%a %b %e %H:%M:%S %Y", localtime;
open(FILE,">>/new_log_file.log");
$output = `/new_script_path/new_script.pl @ARGV 2>&1`;
if ($? == 0)
{
    print FILE "[".$now_string."] Chiled executed succesfuly\n";
} elsif($? == -1)
{
    print FILE "[".$now_string."] FAILED to execute\n";
} elsif($? & 127)
{
   printf FILE "[".$now_string."] child died with signal %d, %s coredump\n", ($? & 127), ($? & 128) ? 'with' : 'without';
} else
{
   printf FILE "[".$now_string."] child exited with value %d (%d) [ %s ]\n", $? >> 8, $?, $output;
}
close(FILE);

私がしたことは、コマンドの STDOUT と STDERR をバックティック (ドキュメントはこちら) でキャプチャし、ログ ファイルに出力することです。

ログファイルに次のメッセージがあり、何が問題なのかがわかりました。

[Mon Feb 27 09:40:41 2012] child exited with value 2 (512) [ Can't locate lib.pl in @INC (@INC contains: [long output removed] ) at /new_script_path/new_script.pl line 30.

私はそれをデバッグする方法の質問に答えました(奇妙な部分は、この新しいコードではステータスコードが 5 ではなく 2 であることです)

これが他の人の助けになることを願って、私の2つの間違いを教えます(間違っている場合は修正してください):

  1. フルパスなしでライブラリをロードしました。
  2. 新しいスクリプトを手動でテストしたとき、スクリプトが存在する同じディレクトリからのみ彼を呼び出しました。
于 2012-02-27T09:14:25.697 に答える