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

时间:2013-11-19 16:50:40

标签: perl

当我在命令提示符下执行以下命令时,它工作正常。但是当我在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

4 个答案:

答案 0 :(得分:7)

perl的backticks and qx//插值变量,所以当你写:

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

perl会插入special variable $2。在您的情况下,$2未设置,因此扩展为空字符串,因此 awk 命令只是{print}

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

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

答案 1 :(得分:5)

尝试使用pgrep

my $process_chk_command = `pgrep truecontrol`;

答案 2 :(得分:3)

my $process_chk_command = `ps -ef | grep truecontrol`;

my (undef,$pid) = split(' ', $process_chk_command, -1);    

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

答案 3 :(得分:0)

忠实于Perl的座右铭,另一种方式:

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