#!/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
사용할 필요가 없습니다앗:
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