在 Linux 上,如何确定进程标题中任意位置具有确切字符串“test test 123”的进程数?

在 Linux 上,如何确定进程标题中任意位置具有确切字符串“test test 123”的进程数?

我已经在 Windows 上解决了这个问题,但如何在 Linux 上做到这一点却让我困惑:

tasklist /V /NH | find "test test 123"

然后我计算输出中非空行的数量。这非常慢但是有效。现在我正在寻找做同样事情的 Linux 方法。

也就是说,“test test 123”可以是完整的流程标题,可以以此开始,可以以它结束,或者只是将其放在中间。这个很重要。

答案1

长话短说: 使用pgrep -cf "test test 123"


ps程序将列出所有正在运行的进程。具体来说,尝试:

ps aux 

现在,您可以使用grep搜索字符串来过滤该列表:

ps aux | grep "test test 123"

这将打印出匹配的行。要对它们进行计数,请使用grep -cwhich 打印出匹配的行数:

ps aux | grep -c "test test 123"

这种方法的问题是grep上面的过程也会出现在结果中。例如,我当前正在编辑一个名为 的文件test test 123,但是如果我运行上面的命令,我将看到文件编辑器的进程及其grep本身:

$ ps aux | grep  "test test 123"
terdon   2461453 22.0  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2462354  0.0  0.0   8832  2292 pts/1    S+   15:53   0:00 grep --color test test 123

因此,grep -c将返回2而不是1

$ ps aux | grep -c "test test 123"
2

这为我们带来了适合这项工作的工具,pgrep.这是专门为查找进程而设计的工具:

$ pgrep -cf "test test 123"
1

意思-c是“计算匹配项”,-f意思是“搜索整个命令行,而不仅仅是进程名称”。

跳过grep自身的另一个常见技巧是使用单字符字符类而不是相同的字符串,以便命令grep行不会包含该字符串:

$ ps aux | grep  "test test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
terdon   2476971  0.0  0.0   8832  2236 pts/1    S+   15:56   0:00 grep --color test test 123
$ ps aux | grep  "[t]est test 123"
terdon   2461453  1.2  0.2 392944 79796 pts/1    Sl   15:53   0:02 emacs test test 123
$ ps aux | grep -c "[t]est test 123"
1

有关此技巧的更多信息,请参阅这里。但如果您的系统具有pgrepLinux 系统那样的功能,则实际上没有必要。

答案2

echo $(( $(ps aux | grep "test test 123" | wc -l) - 1))

应该有窍门

相关内容