Utilizzando Getopt :: Long a guidare un comando di sistema su Linux
-
14-10-2019 - |
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"
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 eseguesystem
, e quindi verificare che variabile. E 'molto chiaro che lo stile all'indietro di robaand/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' );