2011-01-03 4 views
1

Je suis en train d'exécuter un script php avec des arguments, en utilisant le pilote perl suivant:Utiliser getopt Long pour conduire une commande système sur linux

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

mais il semble que quelque chose ne va pas avec:

 
system("php loadAgent_curl.php $argString") 

puisque le système ls commandes fonctionne très bien, mais la commande php avec des arguments qui ne fonctionne pas

les arguments de ligne de commande ot ce script Perl peut être:

-a -h 10 ktest.test.net -t 5 -UN administration -pw adminpassword -p "acViewer/index.html? DateDébut = 20090926040000 20111220235959 & EndDate ="

+2

Quel est le chemin complet vers le binaire 'php'? Est-ce dans le PATH? Pourquoi ne pas essayer de le qualifier pleinement? – ircmaxell

+1

Le script PHP est-il en cours d'exécution ou non? Essayez de résoudre le problème. – justintime

Répondre

0

Vous n'avez pas mentionné le type de message d'erreur que vous obtenez. Était-ce quelque chose comme ou autre chose.

Vous rencontrez peut-être des problèmes avec les guillemets. Voici quelques recommandations:

  • Utilisez qq() au lieu de guillemets. Cela rendra les choses un peu plus propres.
  • Générez la commande dans une variable appelée $command que vous pouvez imprimer en cas d'erreur. Cela pourrait vous aider à comprendre où vous avez peut-être un problème.
  • Définissez une variable appelée $error lors de l'exécution de system, puis vérifiez cette variable. Il est beaucoup plus clair que le style rétroactif de and/or choses que vous avez à faire en cas d'échec et de succès, et c'est beaucoup plus facile à maintenir.

Exemple:

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

Au moins de cette façon, vous pouvez voir ce que la commande a échoué, et avoir une meilleure idée pourquoi il pourrait ne pas avoir exécuté.

4

Contrairement à la plupart des autres commandes Perl, system renvoie 0 sur "succès" et non nul sur "échec". Ainsi, l'idiome typique est

system $command and die ... 

au lieu de

system $command or die ... 

Mise à jour: l'OP a fait obtenir ce droit partiel - system(...)==0 or die ... est aussi une façon parfaitement bien faire la vérification des erreurs sur la commande system.


Il pourrait également être une géniale citation dans la commande exacte que vous passez à la commande system. Pour une tâche comme celle-ci, il est souvent préférable de contourner le shell et d'utiliser le formulaire LIST de system pour passer directement la commande au système d'exploitation. Peut-être quelque chose comme:

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

(et assurez-vous php est dans votre $PATH [ou spécifier le chemin complet vers php] et loadAgent_curl.php est dans le répertoire courant).

0

Essayez PHP - GetOptionKit:

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

synopsis

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'); 
Questions connexes