我试图找到没有通过perl运行的进程。它适用于使用以下代码但不适用于cgred服务的某些进程。
foreach $critproc (@critarray)
{
#system("/usr/bin/pgrep $critproc");
$var1=`/usr/bin/pgrep $critproc`;
print "$var1";
print "exit status: $?\n:$critproc\n";
if ($? != 0)
{
$probs="$probs $critproc,";
$proccrit=1;
}
}
对于cgred
,我必须指定/usr/bin/pgrep -f cgred
来检查是否有任何pid与之关联。
但是,当我在上面的代码中指定-f
时,它会向所有进程提供退出状态0
($?
),即使它没有运行。
你能不能告诉我如何在Perl中将参数传递给unix命令。
由于
答案 0 :(得分:4)
// query to fetch the data from RequestArticles table and set join for store table twice
$requestArticlesDetaile = $this->RequestArticles->get($id, [
'contain' => ['yourstore','fromstore']
]);
// set fetched data to view
$this->set('requestArticlesDetaile', $requestArticlesDetaile);
是什么?您说的$critproc
在哪里给您带来问题?有人可能会想到你有某种逃避问题,但如果-f
$critproc
是cgred
,那就不应该这样了。
鉴于这些问题,我只想回答一般性问题。
以下内容避免了shell,因此无需构建shell命令:
system("/usr/bin/pgrep", "-f", $critproc);
die "Killed by signal ".( $? & 0x7F ) if $? & 0x7F;
die "Exited with error ".( $? >> 8 ) if ($? >> 8) > 1;
my $found = !($? >> 8);
如果需要shell命令,可以使用String :: ShellQuote' shell_quote
来构建它。
use String::ShellQuote qw( shell_quote );
my $shell_cmd = shell_quote("/usr/bin/pgrep", "-f", $critproc) . " >/dev/null";
system($shell_cmd);
die "Killed by signal ".( $? & 0x7F ) if $? & 0x7F;
die "Exited with error ".( $? >> 8 ) if ($? >> 8) > 1;
my $found = !($? >> 8);
或
use String::ShellQuote qw( shell_quote );
my $shell_cmd = shell_quote("/usr/bin/pgrep", "-f", $critproc);
my $pid = `$shell_cmd`;
die "Killed by signal ".( $? & 0x7F ) if $? & 0x7F;
die "Exited with error ".( $? >> 8 ) if ($? >> 8) > 1;
my $found = !($? >> 8);