Domanda

Sto cercando di eseguire uno script php con gli argomenti, utilizzando il seguente driver perl:

#!/opt/local/bin/perl
use strict;
use warnings;
use Getopt::Long;
use Cwd;

my %args = ();

GetOptions(
            \%args,           "NUM_AGENTS|a=s",
            "HOST_NAME|h=s",  "TIME_STAGGER|t=s",
            "USER_NAME|un=s", "USER_PASS|pw=s",
            "TARGET_PAGE|p=s"
) or die "Unknown parameter!\n";

my $i         = 0;
my $startTime = time;

my $pwd = getcwd();

my $logdir = "$pwd/load-logs";

mkdir $logdir
  or die "Cannot mkdir $logdir: $!"
  unless -d $logdir;
chmod 0755, $logdir or die "Cannot chmod 0755 $logdir: $!";

my $startTimeTemp = $args{NUM_AGENTS} + $startTime;
my $startTime2    = $startTimeTemp + 10;

mkdir( "$logdir/$startTime2", 0777 )
  or die "Cannot mkdir $logdir/$startTime2: $!"
  unless -d "$logdir/$startTime2";

my $random_number = rand() * 10;
my $execDelay =
  ( $random_number % $args{TIME_STAGGER} ) * ( ( $random_number % 100 ) );
my $procStartTime = $startTime2 + $execDelay;

my $reqlogfile  = "$logdir/$startTime2/req.log";
my $resplogfile = "$logdir/$startTime2/resp.log";

print "NUM_AGENTS: " . "$args{NUM_AGENTS}\n";
print "HOST_NAME: " . "$args{HOST_NAME}\n";
print "procStartTime: " . "$procStartTime\n";
print "i: " . "$i\n";
print "TARGET_PAGE: " . "$args{TARGET_PAGE}\n";
print "resplogfile: " . "$resplogfile\n";
print "USER_NAME: " . "$args{USER_NAME}\n";
print "USER_PASS: " . "$args{USER_PASS}\n";
print "execDelay: " . "$execDelay\n";
print "COMMON_SID: " . "$args{COMMON_SID}\n";

while ( $args{NUM_AGENTS} > $i ) {
    $i++;
    print "count: " . "$i\n";

    my $argString =
"'$args{NUM_AGENTS}' '$args{HOST_NAME}' '$procStartTime' '$i' '$args{TARGET_PAGE}' 'resplogfile' '$reqlogfile' '$args{USER_NAME}' '$args{USER_PASS}' '$execDelay' '$args{COMMON_SID}'";

    system("php loadAgent_curl.php $argString") == 0 or die "failed to execute: $!";

    sleep 1;

    #system("ls");
}

, ma a quanto pare, che qualcosa non va con:

system("php loadAgent_curl.php $argString") 

dal momento che i comandi di sistema ls funziona bene, ma il comando php con argomenti non

Gli argomenti della riga di comando ot questo script perl possono essere:

-a 10 -h ktest.test.net -t 5 -UN amministratore -pw AdminPassword -p "acViewer / index.html? StartDate = 20.090.926,04 milioni e EndDate = 20.111.220,235959 millions"

È stato utile?

Soluzione

non ha menzionato il tipo di messaggio di errore che stai ricevendo. Era qualcosa come Cannot find "php" o qualcos'altro.

Si potrebbe avere problemi con le citazioni. Ecco alcune raccomandazioni:

  • Usa qq() invece di virgolette. Che sarà rendere le cose un po 'più pulito.
  • Crea il comando in una variabile denominata $command che è possibile stampare nel caso in cui si dispone di errori. Che potrebbe aiutare a capire dove si forse avere un problema.
  • Imposta una variabile chiamata $error quando si esegue system, e quindi verificare che variabile. E 'molto chiaro che lo stile all'indietro di roba and/or che si deve fare in caso di fallimento e successo, ed è molto più facile da mantenere.

Esempio:

my $argString = qq("$args{NUM_AGENTS}" "$args{HOST_NAME}" ) 
    . qq( "$procStartTime" "$i" "$args{TARGET_PAGE}" "resplogfile" )
    . qq("$reqlogfile" "$args{USER_NAME}" "$args{USER_PASS}" )
    . qq("$execDelay" "$args{COMMON_SID}");

my $command = qq(php loadAgent_curl.php $argString);

my $error = system qq($command);
if ($error) {
    die qq(ERROR: Failed to execute "$command"\n\n$!);
}

Almeno in questo modo, si può vedere che cosa comando non riuscito, e avere una migliore idea per cui non avrebbe potuto eseguire.

Altri suggerimenti

A differenza di molti altri comandi Perl, system restituisce 0 in "successo" e non-zero "fallimento". Così il tipico idioma è

system $command and die ...

anziché

system $command or die ...

Aggiorna :. OP ??ha fatto ottenere questa parte destra - system(...)==0 or die ... è anche un perfettamente bene modo per fare il controllo degli errori sul comando system


Ci potrebbe anche essere un po 'funky citando nel comando esatta che stai passando al comando system. Per un compito come questo, è spesso meglio bypass guscio e utilizzare il modulo di LIST system passare il comando direttamente al sistema operativo. Forse qualcosa di simile:

my @argList = ($args{NUM_AGENTS}, $args{HOST_NAME}, $procStartTime, $i,
               $args{TARGET_PAGE}, 'resplogfile', $reqlogfile, $args{USER_NAME},
               $execDelay, $args{COMMON_SID});
system("php", "loadAgent_curl.php", @argList) and die "failed to execute: $!";

(e anche assicurarsi che php è nel vostro $PATH [o specificare il percorso completo php] e loadAgent_curl.php si trova nella directory corrente).

Prova PHP - GetOptionKit:

http://c9s.blogspot.com/2011/11/php- getoptionkit.html

sinossi

use GetOptionKit\GetOptionKit;

$getopt = new GetOptionKit;
$spec = $getopt->add( 'f|foo:' , 'option require value' );  # returns spec object.

$getopt->add( 'b|bar+' , 'option with multiple value' );
$getopt->add( 'z|zoo?' , 'option with optional value' );

$getopt->add( 'f|foo:=i' , 'option require value, with integer type' );
$getopt->add( 'f|foo:=s' , 'option require value, with string type' );
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top