оператор возврата кода статуса возврата 5 (или 1280) - PullRequest
1 голос
/ 27 февраля 2012

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

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

1 Ответ

2 голосов
/ 27 февраля 2012

После долгих поисков я наконец нашел способ его отладки.Посмотрите на новый код:

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.

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

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

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