#!/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)。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}')
这似乎确实有效!