Frage

Ich versuche, ein PHP -Skript mit Argumenten mit dem folgenden Perl -Treiber auszuführen:

#!/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");
}

Aber es scheint, dass etwas nicht stimmt mit:

system("php loadAgent_curl.php $argString") 

Da die Befehle des LS -Systems gut ausgeführt werden, ist der PHP -Befehl mit Argumenten jedoch nicht

Die Befehlszeilenargumente dieses Perl -Skripts können sein:

-a 10 -h ktest.test.net -t 5 -un admin -pw adminpassword -p "acViewer/index.html? startDate = 20090926040000 & enddate = 2011220235959"

War es hilfreich?

Lösung

Sie haben die Art der Fehlermeldung, die Sie erhalten, nicht erwähnt. War es so etwas wie Cannot find "php" oder etwas anderes.

Möglicherweise haben Sie Probleme mit Zitaten. Hier sind einige Empfehlungen:

  • Verwenden qq() anstelle von Anführungszeichen. Das wird die Dinge ein bisschen sauberer machen.
  • Erstellen Sie den Befehl in eine Variable genannt $command Was Sie ausdrucken können, falls Sie Fehler haben. Das könnte Ihnen helfen, zu verstehen, wo Sie vielleicht ein Problem haben.
  • Stellen Sie eine Variable auf, die aufgerufen wurde $error Beim Ausführen system, und überprüfen Sie dann diese Variable. Es ist viel klarer als der Rückwärtsstil von and/or Sachen, die Sie für Misserfolg und Erfolg tun müssen, und es ist viel einfacher zu pflegen.

Beispiel:

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

Zumindest auf diese Weise können Sie sehen, welcher Befehl fehlgeschlagen ist, und eine bessere Vorstellung davon bekommen, warum er möglicherweise nicht ausgeführt wurde.

Andere Tipps

Im Gegensatz zu den meisten anderen Perl -Befehlen,, system Gibt 0 auf "Erfolg" und ungleich Null auf "Misserfolg" zurück. Die typische Idiom ist also

system $command and die ...

Anstatt von

system $command or die ...

Aktualisieren: Das OP hat diesen Teil richtig gemacht - system(...)==0 or die ... ist auch eine vollkommen gute Möglichkeit, Fehler auf die zu überprüfen system Befehl.


In dem exakten Befehl, den Sie übergeben system Befehl. Für eine solche Aufgabe ist es oft am besten, die Shell zu umgehen und die Listenform von zu verwenden system Um den Befehl direkt an das Betriebssystem zu übergeben. Vielleicht so etwas wie:

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

(Und stellen Sie auch sicher php ist in deinem $PATH oder geben Sie den vollständigen Pfad zu php] und loadAgent_curl.php ist im aktuellen Verzeichnis).

Probieren Sie PHP - GetOptionKit:

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

Zusammenfassung

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' );
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top