sh와 함께 pgrep을 사용하지 마십시오

sh와 함께 pgrep을 사용하지 마십시오
#!/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

나는 전혀 모른다무엇 psAIX와 함께 제공되지만 그렇지 않을 수도 있습니다. 모든 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)를 인쇄합니다.NAMEname-vname="$NAME"$ALTERaltvalt="$ALTER"name$0~name$0!~ARGV[0]-sub("-.*","",$NF);$ALTERif($NF > alt)

답변3

ps aux를 사용해 보았는데 이제 다음과 같습니다.

for pr in $(ps aux | grep $NAME | awk '{print$2}')

이것이 효과가 있는 것 같습니다!

관련 정보