1

次の perl ドライバーを使用して、引数を指定して php スクリプトを実行しようとしています。

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

しかし、何かが間違っているようです:

system("php loadAgent_curl.php $argString") 

ls システム コマンドは正常に実行されますが、引数を指定した php コマンドは実行されないためです。

この perl スクリプトのコマンド ライン引数は次のとおりです。

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

4

3 に答える 3

4

他のほとんどの Perl コマンドとは異なりsystem、「成功」の場合は 0 を返し、「失敗」の場合はゼロ以外を返します。したがって、典型的なイディオムは

system $command and die ...

それ以外の

system $command or die ...

更新:OPはこの部分を正しく取得しました-コマンドsystem(...)==0 or die ...でエラーチェックを行うための完全に優れた方法でもありますsystem


コマンドに渡す正確なコマンドには、ファンキーな引用符が含まれている場合もありますsystem。このようなタスクでは、多くの場合、シェルをバイパスし、LIST 形式を使用しsystemてコマンドを OS に直接渡すのが最善です。たぶん次のようなもの:

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

(また、 [またはへの完全なパスを指定する]にあり、現在のディレクトリにあることも確認phpしてください)。$PATHphploadAgent_curl.php

于 2011-01-03T17:51:33.353 に答える
0

PHP を試す - GetOptionKit:

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

あらすじ

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' );
于 2011-11-29T07:00:28.400 に答える
0

表示されるエラー メッセージの種類については言及していません。それは何かのようなものでしたか、Cannot find "php"それとも何か他のものでしたか。

引用符に問題がある可能性があります。いくつかの推奨事項を次に示します。

  • qq()引用符の代わりに使用します。それは物事を少しきれいにします。
  • $commandエラーが発生した場合に出力できる変数にコマンドを組み込みます。どこに問題があるのか​​を理解するのに役立つかもしれません。
  • $error実行時に呼び出される変数を設定し、systemその変数を確認します。and/or失敗や成功の際にやらなければならない後ろ向きなスタイルよりもはるかに明確であり、維持するのもはるかに簡単です。

例:

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

少なくともこの方法で、どのコマンドが失敗したかを確認でき、実行されなかった理由をよりよく理解できます。

于 2011-01-03T21:33:46.660 に答える