grep -c 给出不一致的输出

grep -c 给出不一致的输出

我正在尝试通过以下命令行确定正在运行的进程数:

ps aux | grep -c 'Xvfb :1'

当进程“fiji:1”未运行时,我有时会得到值 0,有时得到值 1。运行 grep 命令的行为似乎有时被计算在内,有时则不被计算在内。

运行下面的命令行始终导致零进程:

ps aux | grep 'fiji :1' | grep -v grep

与添加类似grep -v grep,有没有办法让“grep -c”计算正在运行的进程数减去 grep 命令?

ps aux | grep Xvfb给出这个:

60293 17250 0.0 0.1 45052 7016 pts/4 S Sep30 0:02 Xvfb :4 -screen 0 1600x1200x16 
60293 17373 0.0 0.0 40704 2964 pts/0 S Sep30 0:02 Xvfb :5 -screen 0 800x600x16 
60293 29695 0.0 0.1 42996 6112 pts/6 S 13:00 0:00 Xvfb :3 -screen 0 1600x1200x16 
60293 31650 0.0 0.0 61160 756 pts/6 R+ 13:58 0:00 grep Xvfb

pgrep 'Xvfb :3' | wc -l不能完全工作,因为当实际上有 1 个进程正在运行时它却返回 0。

pgrep 'Xvfb' | wc -l返回 3,这是正确的。

我也尝试过pgrep 'Xvfb :3 -screen 0 1600x1200x16' | wc -l并且它错误地返回了 0。

好像pgrep不喜欢里面的空间Xvfb :3

答案1

默认情况下,pgrep检查进程名称 - 默认情况下,可执行文件名被截断为 16 个字节。要检查完整的命令行,如ps aux,请使用-f选项。

pgrep -f "Xvfb" | wc -l

比较:pgrep -l "Xvfb"pgrep -lf "Xvfb"

答案2

我会尝试

pgrep 'fiji :1' | wc -l

(希望fiji :1是流程名称)

答案3

到目前为止我发现的最佳替代方案是grep从列表中过滤掉并照常ps使用,如下所示:grep

ps -N -C grep u | grep -F -c 'kded [kdeinix]'
   ^^^^^^^^^^ not grep

相关内容