我一直在寻找最好的方法来通过Linux中的命令行find具有相同名称的正在运行的进程的数量。 例如,如果我想find正在运行的bash进程的数量并获得“5”。 目前我有一个脚本,做一个“pidof”,然后做记号string计数。 这工作正常,但我想知道是否有一个更好的方式,可以完全通过命令行完成。 在此先感谢您的帮助。
在pgrep
可用的系统上, -c
选项返回与给定名称匹配的进程数的计数
pgrep -c command_name
请注意,这是grep
风格的匹配,而不是完全匹配,所以例如pgrep sh
也将匹配bash
进程。 如果你想要一个完全匹配,也可以使用-x
选项。
如果pgrep
不可用,可以使用ps
和wc
。
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
nproc
是coreutils
一部分。 所以,它应该在大多数Linux发行版上可用。