
#!/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
全然知らない何 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、プロセスパラメータ(プロセス名を含む)、経過時間を印刷します。その後、それを渡すと(In awk script:)と(In awk script:)の値も受け取りますawk
。行が()と一致し、awkプロセス自体ではない場合()、最後のフィールドの最初のフィールドの後のすべての項目を削除し()、最後のフィールドの残りの部分が()より大きい場合、最初のフィールド(PID)を印刷します。します。NAME
name
-vname="$NAME"
$ALTER
alt
valt="$ALTER"
name
$0~name
$0!~ARGV[0]
-
sub("-.*","",$NF);
$ALTER
if($NF > alt)
答え3
ps auxを使ってみましたが、今は
for pr in $(ps aux | grep $NAME | awk '{print$2}')
これが効果があるようです!