2012-02-27 4 views
1

(PPPoE接続の場合)半径の自動認識スクリプトを交換する必要がありました。これは頻繁に使用されるサービスで、24時間365日稼働しているので、新しいスクリプトをテストするために、元のスクリプトの最初に小さなコードを挿入して、新しいスクリプトを呼び出す新しいプロセスをforkしました。スクリプトが失敗する)。ビット、$の値をシフトさせずバックティックオペレーターの返信ステータスコード5(または1280)

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

:私はこのメッセージを持っていた

$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; 
} 

は、残念ながら、これは新しいスクリプトを実行するのに失敗し、ログファイルに:これが挿入されたコードのですか? 1280である。

新しいスクリプトは、マニュアルで呼び出すと期待通りに機能します。

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

答えて

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); 

はバッククォート(ドキュメントhere)でコマンドの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. 

は(奇妙な部分があり、この新しいコードステータスコード私は完全なパスなしlibがロードされ

  1. :2ではない5)

    が、これは私が私の2つの過ちは(私が間違っている場合は、私を修正してください)何であったかを教えてくれる人を助けることを願っています。

  2. 新しいスクリプトを手作業でテストしたとき、私はそのスクリプトが存在するのと同じディレクトリからしか彼を呼び出しませんでした。
関連する問題