避免在 sh 中使用 pgrep

避免在 sh 中使用 pgrep
#!/bin/sh
ALTER="$1"
NAME="$2"

for pr in $(pgrep $NAME); do 
    elapse=$(ps -o etime= -p $pr)
    [ "${elapse%-*}" -gt "$ALTER" ] && echo $pr
done

我在不支持pgrep.如果没有 ,我该怎么做pgrep

答案1

好吧,用一个标准的linuxprocps-ng ps二进制,可以避免它,例如:

#!/bin/sh
ALTER="$1" NAME="$2" IFS=' 
'
set -- $(ps -opid=,etime= -C"$NAME")
while  [ 0  -lt   $# ]
do     case $2 in (*-*)
       [ "${2%-*}" -gt "$ALTER" ] &&
       printf %d\\n "$1"
       esac; shift 2
done

我不知道什么 ps随 AIX 一起提供,但可能不是这样。您绝对可以从任何 POSIX 获取 pid ps。它只是需要更多的工作。

set -- $(
    ps -Aocomm=,pid=,etime= |
    sed -ne "s/^$NAME  *//p"
)

...应该完美地替换为 POSIXps和 POSIX sed

不过,我确实喜欢这样做ps -C"$NAME",但不明白为什么有人使用pgrep

答案2

你总是可以尝试解析ps自身:

ps -xa -o "%p %a %t" | 
    awk -vname="$NAME" -valt="${ALTER}" '
        $0~name && $0!~ARGV[0]{
            sub("-.*","",$NF); 
            if($NF > alt){print $1}
        }'

ps命令将打印 PID、进程参数(包括进程名称)和经过的时间。然后将它们传递给它,它还接收(在 awk 脚本中:) 和(在 awk 脚本中: )awk的值。如果一行匹配( ) 并且不是 awk 进程本身 ( ),则删除最后一个字段中第一个字段之后的所有内容 ( ),如果最后一个字段的剩余部分大于( ),则打印第一个字段( PID)。NAMEname-vname="$NAME"$ALTERaltvalt="$ALTER"name$0~name$0!~ARGV[0]-sub("-.*","",$NF);$ALTERif($NF > alt)

答案3

我尝试使用 ps aux,现在看起来像这样:

for pr in $(ps aux | grep $NAME | awk '{print$2}')

这似乎确实有效!

相关内容