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

问题描述 投票:0回答:10

我一直在寻找通过 Linux 命令行查找正在运行的同名进程数量的最佳方法。例如,如果我想查找正在运行的 bash 进程的数量并得到“5”。目前我有一个脚本,它执行“pidof”,然后对标记化字符串进行计数。这工作正常,但我想知道是否有更好的方法可以完全通过命令行完成。在此先感谢您的帮助。

linux command-line process count
10个回答
72
投票

在具有

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 -x -c command_name
ps -C command_name -e --no-headers | wc -l
子串匹配
pgrep -c command_name
不适用
仅限当前用户
pgrep -U "$UID" -c command_name
ps -C command_name --no-headers | wc -l

还有更多的可能性,这里无法一一列举。如果您需要不同的行为,请检查

pgrep
ps
的手册页,您可能会找到实现它的选项。


11
投票
result=`ps -Al | grep command-name | wc -l`
echo $result

8
投票
ps -Al | grep -c bash

6
投票

你可以试试:

ps -ef | grep -cw [p]rocess_name

ps aux | grep -cw [p]rocess_name

例如:

ps -ef | grep -cw [i]nit

3
投票

上面的一些方法对我不起作用,但它们帮助了我。

ps aux | grep [j]ava -c

对于 Linux 新手:

ps aux
打印所有当前正在运行的进程,
grep
搜索与单词java匹配的所有进程,
[]
括号删除您刚刚运行的进程,因此它不会将其包含为正在运行的进程,最后是
 -c
选项代表计数。


3
投票

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

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]) } }'

1
投票

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


1
投票

您可以将

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
,这是更优雅的方式。


1
投票

ps aux | wc -l

此命令显示所有用户在系统上运行的进程数。

对于特定用户,您可以使用以下命令:

ps -u <username> | wc -l

运行前替换为实际用户名:)


0
投票

ps-敬畏| grep CAP |厕所-l

这里“CAP”是我的 Process_Names 中的单词。

此命令输出 = 进程数 + 1

这就是为什么当我们运行这个命令时,我们的系统读取到“ps -awef | grep CAP | wc -l ”也是一个进程。

所以我们真正的答案是(进程数)= 命令输出 - 1

注意:这些进程只是那些包含“CAP”名称的进程

© www.soinside.com 2019 - 2024. All rights reserved.