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

さて、標準のLinuxを使ってください。procps-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

全然知らない psAIXに付属していますが、そうでない場合があります。すべての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、プロセスパラメータ(プロセス名を含む)、経過時間を印刷します。その後、それを渡すと(In awk script:)と(In awk script:)の値も受け取ります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}')

これが効果があるようです!

関連情報