Perl system()命令即使在退出循环后也会运行

Perl system()命令即使在退出循环后也会运行,perl,Perl,这是一个简单的Perl脚本,它接受两个参数——一个是URL的字符串和一个整数值 我所要做的就是在给定的时间段(以秒为单位)内对传递的URL运行curl请求 当URL像这样简单时,一切都很好http://admin:admin@localhost:5074/?q=james但当URL中有&时问题就会出现 问题是,即使在退出循环后,使curl请求保持运行的系统仍然存在 发生什么事了 use strict; use warnings; use URI::Escape; my $url = uri_e

这是一个简单的Perl脚本,它接受两个参数——一个是URL的字符串和一个整数值

我所要做的就是在给定的时间段(以秒为单位)内对传递的URL运行curl请求

当URL像这样简单时,一切都很好http://admin:admin@localhost:5074/?q=james但当URL中有&时问题就会出现

问题是,即使在退出循环后,使curl请求保持运行的系统仍然存在

发生什么事了

use strict;
use warnings;
use URI::Escape;

my $url = uri_escape($ARGV[0]);
print "URL=".$url."\n"; 
my $duration = $ARGV[1];
print $duration;
my $start = time(); 
my $end = $start + $duration;
my $request = 0;

while(time() <= $end ){ 
    system("curl --user admin:admin --digest ".uri_unescape($url)); 
    $request++;
}

print "------------------------ END ----------------------------------\n";
print "URL = ".uri_unescape($url)." \n";
print "Total requests made = ".$request."\n";
print "Reqs/sec = ".($request/$duration)."/sec \n";
#print $start."\n";
#print $end."\n";
print "Duration = ".$duration." sec \n";
print "-------------------------------------------------------------------\n";
您的URL中有一个&字符,shell将其解释为“在后台运行此命令”。您需要正确转义元字符,例如&以避免shell通过以下方式解释它们:

use String::ShellQuote qw( shell_quote );
system("curl --user admin:admin --digest " . shell_quote($url)); 
或首选:

system('curl', '--user', 'admin:admin', '--digest', $url);
后者完全避免创建shell,forks/exec直接使用给定的参数进行卷曲,这些参数会自动转义。它更快更安全。有关更多信息,请参阅


顺便说一下,你应该考虑使用。它是Perl核心的一部分,用于更新的Perl无需安装,您无需担心转义任何内容。

为什么不使用光滑的WWW::Mechanize或LWP模块?我想使用本机Perl模块,因为我希望能够在任何机器上运行,而无需处理安装Perl模块的问题将URL传递给乌里乌风景。uri_unescape用于在unescape分隔符之间对组件进行unescape。我已经更新了您的问题,包括标题,以引用系统而不是系统。Perl标识符区分大小写;系统可能很容易成为一些无关的用户定义函数。太棒了!这很有效。非常感谢rjh、sputnik、ikegami和Kieth。谢谢你的时间。
system('curl', '--user', 'admin:admin', '--digest', $url);