#!/bin/sh
ALTER="1153"
NAME="aio"
for i in $(ps -eo pid,etime,comm | \
awk -v alt="$ALTER" -v name="$NAME" '$2~/[^0-alt]-/ && $3~/name/{print$1} ');
do
echo $i
done
答案1
没有必要使用awk:
for pr in $(pgrep $NAME); do
elapse=$(ps -o etime= -p $pr)
[ "${elapse%-*}" -gt "$ALTER" ] && echo $pr
done
或根据斯蒂芬·查泽拉斯' 评论
ps -C $NAME -o pid=,etime= | awk '$2 + 0 > a && /-/ {print $1}' a="$ALTER"
答案2
用这个:
awk -v alt="$ALTER" -v name="$NAME" '
$2 ~ /-/ && $2 >= alt && $3 ~ name{print $1}' file
$2 ~ /-/
:检查是否包含天数。$2 >= alt
:检查 中的天数etime
是否大于$ALTER
。$3 ~ name
:在第三个字段中搜索name
( )的值。$NAME
另一个纯bash
解决方案:
ps -eo pid,etime,comm | while read p e n; do
if [[ $n =~ $NAME ]] && [[ $e =~ \- ]] && [ "${e%%-*}" -gt "$ALTER" ]; then
echo $p
fi
done
while read p e n
将 pid、etime 和命令名称存储在变量$p
、$e
和中$n
。[[ $n =~ $NAME ]]
:检查命令$NAME
中是否有[[ $e =~ \- ]]
:检查 etime 中是否有破折号 (-)(表示该进程运行超过一天)[ "${e%%-*}" -ge "$ALTER" ]
:检查 etime 的日计数器是否大于或等于中的值$ALTER
- 如果满足以上所有条件,则打印 pid:
echo $p