我已经在 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 -c
which 打印出匹配的行数:
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
有关此技巧的更多信息,请参阅这里。但如果您的系统具有pgrep
Linux 系统那样的功能,则实际上没有必要。
答案2
echo $(( $(ps aux | grep "test test 123" | wc -l) - 1))
应该有窍门