Domanda

Avevo bisogno di sostituire uno script di autentificazione del raggio (per le connessioni PPPOE). Questo è un servizio fortemente usato che funziona 24 ore su 24, 7 giorni su 7, quindi per testare il nuovo script ho iniettato un piccolo codice nell'inizio dello script originale per forconare un nuovo processo che chiamato il nuovo script (senza il pericolo di rompere qualcosa se il nuovo lo script non fa). Questo è il codice iniettato:

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

Sfortunatamente questo non è riuscito a eseguire il nuovo script e nei file di registro ho avuto questo messaggio:

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

Senza spostare i bit, il valore di $? è 1280;

La nuova sceneggiatura funziona come previsto se lo chiami manuale.

Cosa significa Codice di stato 5? Come posso eseguire il debug del comando nel backtick per scoprire cosa non va?

È stato utile?

Soluzione

Dopo molta ricerca ho trovato la strada per eseguire il debug. Guarda il nuovo codice:

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

Quello che ho fatto è catturare STDOUT e STDERR del comando nel backtick (documentazione qui ) e stampalo nel file di registro.

Ora ho trovato questo messaggio nel file di registro e ho trovato ciò che non andava:

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

Ho risposto alla domanda, su come eseguire il debug (la parte strana è che con questo nuovo codice il codice di stato non è 2 non 5)

Nella speranza questo aiuterà gli altri ti dirò quali sono stati i miei 2 errori (per favore correggimi se sbaglio):

  1. Ho caricato una lib senza l'intero percorso.
  2. Quando ho testato la nuova sceneggiatura, l'ho chiamato solo dalla stessa directory in cui risiede.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top