我正在尝试通过以下命令行确定正在运行的进程数:
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