如何通过规范路径(带参数)计算某个进程的实例数?

如何通过规范路径(带参数)计算某个进程的实例数?

假设我运行以下命令:

sleep 500
/bin/sleep 500
sleep 30

我感兴趣的是,如何使用某些参数来计算睡眠程序的实例数量(在本例中唯一的参数是500)。

因此,在上面的示例中,如果我计算 的实例数/bin/sleep 500,它应该返回 2。

我尝试了这个:pgrep -xfc '/bin/sleep 500',但由于它与括号中的参数完全匹配,因此sleep 500不被计算在内。

答案1

在您的示例中,您可以使用:

pgrep -fc 'sleep 500'

它同时匹配/bin/sleep 500sleep 500

或者如果你想更精确:

pgrep -fc 'sleep 500$'

答案2

在 GNU 系统上:

$ ps --no-header -C sleep -o args | grep -Ec ' 500( |$)'
2

答案3

在支持类似 Linux 的系统上/proc

#!/bin/sh
if [ $# != 2 ]
then
    echo usage: "$0" pathname commandline_regexp
    exit 1
fi
cd /proc
for p in [0-9]*
do
    exe=$(readlink $p/exe 2>/dev/null)
    if [ "$exe" = "$1" ] &&
        cat $p/cmdline 2>/dev/null | tr '\0' ' ' | grep -q -- "$2"
    then
        echo match $p
    fi
done

例子:

$ sleep 500&
[3] 18280
$ sleep 600&
[4] 18281
$ ./rpgrep /bin/sleep '.*sleep 500 $'
match 18280
$ ./rpgrep /bin/sleep '.*sleep.*00'
match 18280
match 18281

笔记:

  • 2>/dev/null和单独的进程cat用于应对脚本运行时进程可能消失的可能性。

相关内容