在Linux中通过命令行查找进程数

我一直在寻找最好的方法来通过Linux中的命令行find具有相同名称的正在运行的进程的数量。 例如,如果我想find正在运行的bash进程的数量并获得“5”。 目前我有一个脚本,做一个“pidof”,然后做记号string计数。 这工作正常,但我想知道是否有一个更好的方式,可以完全通过命令行完成。 在此先感谢您的帮助。

pgrep可用的系统上, -c选项返回与给定名称匹配的进程数的计数

 pgrep -c command_name 

请注意,这是grep风格的匹配,而不是完全匹配,所以例如pgrep sh也将匹配bash进程。 如果你想要一个完全匹配,也可以使用-x选项。

如果pgrep不可用,可以使用pswc

 ps -C command_name --no-headers | wc -l 

ps-C选项将command_name作为参数,程序将打印一个关于进程的可执行文件名与给定命令名相匹配的信息表。 这是一个完全匹配,而不是grep -style。 --no-headers选项禁止通常作为第一行打印的表格的标题。 使用--no-headers ,每个进程匹配一行。 然后wc -l计数并打印输入中的行数。

 result=`ps -Al | grep command-name | wc -l` echo $result 
 ps -Al | grep -c bash 

上面的一些不适合我,但是他们帮助我走上了这条路。

 ps aux | grep [j]ava -c 

对于新手到Linux:

ps aux打印所有当前正在运行的进程, grep搜索匹配单词java的所有进程, []括号删除刚刚运行的进程,因此不会将其作为正在运行的进程,最后-c选项表示count。

你可以试试 :

ps -ef | grep -cw [p] rocess_name

要么

ps aux | grep -cw [p] rocess_name

例如:

ps -ef | grep -cw [i] nit

列出所有进程名称,排序和计数

 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”也可以作为命令行参数传递。 而且,很少系统进程可以放入例外列表。

我不知道其他发行版是什么,但在Ubuntu上,它是:

 nproc 

nproccoreutils一部分。 所以,它应该在大多数Linux发行版上可用。