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