如何使用perl单独获取linux进程id



当我在命令提示符下执行以下命令时,它可以正常工作。但是,当我在perl脚本中包含相同的内容时,它会显示整个进程的名称。

ps -ef | grep truecontrol | awk '{print$2}'

返回

4567
3456

当我通过perl执行它时,它显示了整个过程的细节。我想把它分配给一个变量数组并处理它。让我知道如何做?

my $process_chk_command = `ps -ef | grep truecontrol | awk '{print$2}'`;
print($process_chk_command);

root      9902  9890  0 05:50 ?        00:00:03 /opt/abc/jre/bin/java -DTCFTP=1 -d64 -Xms16m -Xmx64m -Djava.library.path=/opt/abc/server/ext/wrapper/lib -cla

perl的backticks和qx//插值变量,所以当您编写:

my $process_chk_command = `ps -ef | grep truecontrol | awk '{print $2}'`;

perl对特殊变量CCD_ 1进行插值。在您的情况下,未设置$2,因此扩展为空字符串,因此awk命令只是{print}

你可以避开美元符号(`ps ... | awk '{print $2}'`)来避免这种情况。

(顺便说一句,我建议grep [t]ruecontrol防止grep匹配它自己的进程表条目,或者它构造管道的父shell的条目。具有POSIX弯板的sh爱好者可能还会建议`ps -eo pid,comm,args | awk '/[t]ruecontrol/{print $1}'`。)

尝试使用pgrep

my $process_chk_command = `pgrep truecontrol`;
my $process_chk_command = `ps -ef | grep truecontrol`;
my (undef,$pid) = split(' ', $process_chk_command, -1);    

ps,有一个perl实用程序可以将awk脚本转换为perl:a2p

这是Perl的座右铭,另一种方式:

my $pcc=`killall -s truecontrol`;
my (undef,undef,$pid)=split(' ',$pcc);
print $pid;

最新更新