
#!/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
좋아, 표준 리눅스를 사용해라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"
)
...POSIX ps
와 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}')
이것이 효과가 있는 것 같습니다!