2012-02-27 3 views
1

Мне нужно было заменить сценарий авторизации радиуса (для соединений PPPoE). Это сильно используемый сервис, который работает 24/7, поэтому для тестирования нового скрипта я ввел небольшой код в начале исходного скрипта, чтобы разблокировать новый процесс, который вызвал новый скрипт (без опасности сломать что-то, если новый ошибки сценария). Это внедренный код:Код возврата возврата backtick оператора 5 (или 1280)

$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? Как я могу отлаживать команду в ответной подсказке, чтобы узнать, что происходит?

ответ

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 команды в кавычкой (документации here), и распечатать его в файле журнала.

Теперь я нашел это сообщение в лог-файле, и обнаружили, что было не так:

[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. 

Я ответил на вопрос о том, как его отладить (странная часть что с этим новым кодом с кодом состояния 2 не 5)

В надежде, что это поможет другим я скажу вам, что мои 2 ошибки (пожалуйста, поправьте меня, если я ошибаюсь):

  1. Я загрузил LIB без полного пути ,
  2. Когда я проверил новый скрипт, я только позвонил ему из того же каталога, где он находится.
Смежные вопросы