Pregunta

Estoy intentando ejecutar un script php con argumentos, con el siguiente controlador 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");
}

pero parece que algo está mal con:

system("php loadAgent_curl.php $argString") 

desde los comandos del sistema ls funciona muy bien, pero el comando php con argumentos no

Los argumentos de línea de comandos AT este script Perl puede ser:

10 -a -h ktest.test.net -t 5 -UN administrador -pw adminpassword -p "acViewer / index.html? StartDate = 20090926040000 y 20111220235959 EndDate ="

¿Fue útil?

Solución

no mencionó el tipo de mensaje de error que está recibiendo. Era algo así como Cannot find "php" o algo más.

podría estar teniendo problemas con comillas. He aquí algunas recomendaciones:

  • Uso qq() en lugar de comillas. Eso va a hacer las cosas un poco más limpia.
  • Construir el comando en una variable llamada $command que se puede imprimir en caso de tener errores. Eso podría ayudar a entender donde tal vez tener un problema.
  • Establecer una variable llamada $error al ejecutar system, y después comprobar esa variable. Es mucho más claro que el estilo de cosas al revés and/or que tiene que hacer el fracaso y el éxito, y es mucho más fácil de mantener.

Ejemplo:

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

Al menos esta manera, se puede ver lo que fallaron mandar, y obtener una mejor idea de por qué no podría haber ejecutado.

Otros consejos

A diferencia de la mayoría de los otros comandos de Perl, system devuelve 0 en el "éxito" y que no sea cero en "fracaso". Por lo que el lenguaje típico es

system $command and die ...

en lugar de

system $command or die ...

Actualizar . OP hizo llegar esta parte derecha - system(...)==0 or die ... es también una manera perfectamente bien que hacer la comprobación de errores en el comando system


También podría haber algún cobarde citando en el comando exacto que está pasando al comando system. Para una tarea como esta, es a menudo mejor es evitar la cáscara y el uso de la forma de la lista de system para pasar el comando directamente al sistema operativo. Tal vez algo como:

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: $!";

(y también asegurarse de php está en su $PATH [o especificar la ruta completa a php] y loadAgent_curl.php está en el directorio actual).

Trate de PHP - GetOptionKit:

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

sinopsis

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' );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top