我一直在寻找通过 Linux 命令行查找正在运行的同名进程数量的最佳方法。例如,如果我想查找正在运行的 bash 进程的数量并得到“5”。目前我有一个脚本,它执行“pidof”,然后对标记化字符串进行计数。这工作正常,但我想知道是否有更好的方法可以完全通过命令行完成。在此先感谢您的帮助。
在具有
pgrep
可用的 Linux 系统(也许还有一些非 Linux 系统)上,-c
/--count
选项返回与给定名称匹配的进程数:
pgrep --count command_name
如果
pgrep
不可用,您也许可以使用 ps
和 wc
。同样,这可能在某种程度上取决于系统,但在典型的 Linux 系统上,以下命令将为您提供进程计数:
ps -C command_name -e --no-headers | wc -l
-C
的 ps
选项将 command_name
作为参数,程序将打印有关其可执行名称与给定命令名称匹配的进程的信息表。 -e
使其搜索所有用户拥有的进程,而不仅仅是调用用户。 --no-headers
选项会隐藏表格的标题,这些标题通常打印为第一行。使用 --no-headers
,您可以为每个进程匹配一行。然后 wc -l
计算并打印其输入中的行数。
这些命令之间有一些关键区别:
pgrep
使用 grep
风格匹配,所以例如pgrep sh
也将匹配 bash
进程。如果您想要精确匹配,还可以使用 -x
/--exact
选项。另一方面,ps -C
使用精确匹配,而不是 grep
风格。ps
将为自身和/或它通过管道传输到的任何其他进程输出一行,如果它们符合您给出的进程选择标准。所以 ps -C ps --no-headers | wc -l
和 ps -C wc --no-headers | wc -l
总是会输出至少 1,因为它们正在计算自己。另一方面,pgrep
排除了自身。因此,除非有其他单独的 pgrep --count pgrep
进程正在运行,否则 pgrep
将输出 0。 (通常,pgrep
行为就是您想要的,这就是为什么我通常建议使用pgrep
(如果可用)。)以下是一些变化的总结:
使用案例 | pgrep | ps |
---|---|---|
精确匹配 |
|
|
子串匹配 |
|
不适用 |
仅限当前用户 |
|
|
还有更多的可能性,这里无法一一列举。如果您需要不同的行为,请检查
pgrep
和 ps
的手册页,您可能会找到实现它的选项。
result=`ps -Al | grep command-name | wc -l`
echo $result
ps -Al | grep -c bash
你可以试试:
ps -ef | grep -cw [p]rocess_name
或
ps aux | grep -cw [p]rocess_name
例如:
ps -ef | grep -cw [i]nit
上面的一些方法对我不起作用,但它们帮助了我。
ps aux | grep [j]ava -c
对于 Linux 新手:
ps aux
打印所有当前正在运行的进程,grep
搜索与单词java匹配的所有进程,[]
括号删除您刚刚运行的进程,因此它不会将其包含为正在运行的进程,最后是 -c
选项代表计数。
列出所有进程名称,排序并计数
ps --no-headers -A -o comm | sort | uniq -c
您还可以列出附加到 tty 的进程
ps --no-headers a -o comm | sort | uniq -c
您可以过滤:
ps --no-headers -A -o comm | awk '{ list[$1] ++ } END { for (i in list) { if (list[i] > 10) printf ("%20s: %s\n", i, list[i]) } }'
以下 bash 脚本可以作为 cron 作业运行,如果任何进程分叉过多,您可能会收到电子邮件。
for i in `ps -A -o comm= --sort=+comm | uniq`;
do
if (( `ps -C $i --no-headers | wc -l` > 10 )); then
echo `hostname` $i `ps -C $i --no-headers | wc -l` ;
fi
done
将 10 替换为您关注的号码。
TODO:“10”也可以作为命令行参数传递。另外,很少有系统进程可以放入例外列表。
您可以将
ps
(将显示进程快照)与wc
(将计算单词数,wc -l
选项将计算行数,即换行符)。
这非常容易记住。
ps -e | grep processName | wc -l
这个简单的命令将打印当前服务器上运行的进程数。 如果您想查找当前用户在当前服务器上运行的进程数,请使用
-U
的 ps
选项。
ps -U root | grep processName | wc -l
用用户名更改root。
但是正如许多其他答案中提到的,您也可以使用
ps -e | grep -c process_name
,这是更优雅的方式。
ps aux | wc -l
此命令显示所有用户在系统上运行的进程数。
对于特定用户,您可以使用以下命令:
ps -u <username> | wc -l
运行前替换为实际用户名:)
ps-敬畏| grep CAP |厕所-l
这里“CAP”是我的 Process_Names 中的单词。
此命令输出 = 进程数 + 1
这就是为什么当我们运行这个命令时,我们的系统读取到“ps -awef | grep CAP | wc -l ”也是一个进程。
所以我们真正的答案是(进程数)= 命令输出 - 1
注意:这些进程只是那些包含“CAP”名称的进程