我正在做以下事情:
#!/usr/bin/perl
use strict;
use warnings;
my $proc = `ps -ef|grep -c myscriptname`;
print $proc;
Run Code Online (Sandbox Code Playgroud)
当我在脚本中运行它时,它会打印2.
ps -ef|grep -c myscriptname在命令行上只显示:1
为什么?
同样的 my $proc = qx/ps -ef|grep -c myscriptname/
更新
要明确我运行此片段somerandomscript.pl
更新2
遵循edorqui的建议我删除-c获取:
12013 15777 15776 0 14:11 pts/6 00:00:00 sh -c ps -ef | grep myscriptname
12013 15779 15777 0 14:11 pts/6 00:00:00 grep myscriptname Argument "12013 15777 15776 0 14:11 pts/6 00:00:00 sh -c ps..." isn't numeric in numeric gt (>) at somerandomscript.pl line 8
Run Code Online (Sandbox Code Playgroud)
从脚本里面
该ps -ef命令显示grep本身.
要跳过此行为,请尝试grepping以获取与grep本身不匹配的正则表达式条件:
ps -ef | grep myscript[n]ame
Run Code Online (Sandbox Code Playgroud)
或者类似的东西可以做到:
ps -ef | grep myscriptnam[e]
Run Code Online (Sandbox Code Playgroud)
如果您sleep在后台运行命令:
$ sleep 100 &
[1] 9768
Run Code Online (Sandbox Code Playgroud)
然后用以下方法查找ps -ef:
$ ps -ef | grep sleep
me 9768 3673 0 14:00 pts/6 00:00:00 sleep 100
me 9771 3673 0 14:00 pts/6 00:00:00 grep --color=auto sleep
Run Code Online (Sandbox Code Playgroud)
你得到两行:进程本身和grep寻找它的命令.为了避免它并显示它自己的过程,我们可以:
$ ps -ef | grep -v grep | grep sleep
Run Code Online (Sandbox Code Playgroud)
或者在代码中使用正则表达式,以便grep进程不匹配:
$ ps -ef | grep slee[p]
me 9768 3673 0 14:00 pts/6 00:00:00 sleep 100
Run Code Online (Sandbox Code Playgroud)
因为线
me 9771 3673 0 14:00 pts/6 00:00:00 grep --color=auto sleep
Run Code Online (Sandbox Code Playgroud)
不符合grep slee[p].