UNIX에서 어떤 프로세스가 6시간 이상 실행되고 있는지 알고 싶습니다. 어떻게 찾을 수 있나요?
답변1
사용 가능한 항목에 따라 일반적인 접근 방식은 다음과 같습니다.
ps -o pid,lstart
다음을 사용하여 결과에 대해 for 루프를 실행합니다.
date -j -f %c "$sdate" +%s
날짜를 UNIX 타임스탬프로 변환합니다. 거기에서 그것은 다음과 같습니다 :
time=$((`date +%s`-`date -j -f %c "$sdate" +%s`))
echo $time
프로세스가 실행된 시간(초)을 알려주어야 합니다. 시간으로 변환하는 것은 간단해집니다.
즉, 스크립트 작성을 마치게 됩니다.
답변2
다음 기능을 사용하여 프로세스 실행 시간을 분 단위로 얻을 수 있습니다.
GetProcTime() {
local p=$1
ps -eao "%C %U %c %t" |
awk "/$p/"'{print $4}' |
awk -F":" '{{a=$1*60} {b=a+$2}; if ( NF != 2 ) print b ; else print $1 }'
}
시험
root@ubuntu:/tmp# GetProcTime monit
10
root@ubuntu:/tmp# if [[ $(GetProcTime monit) -ge 360 ]]; then echo "Process is running more than 6 hrs"; else echo "OK"; fi
OK
root@ubuntu:/tmp# GetProcTime init
466
root@ubuntu:/tmp# if [[ $(GetProcTime init) -ge 360 ]]; then echo "Process is running more than 6 hrs"; else echo "OK"; fi
Process is running more than 6 hrs
답변3
이 명령은 어제부터 n시간 이상 실행된 프로세스를 출력합니다. 프로세스는 오늘의 프로세스만 스캔합니다.
ps -Ao ppid,pid,user,stime,cmd --sort=-pcpu | awk -v dateee=$(date +%H) '{ if (substr($4,3,1) ==":" && ( dateee-substr($4,1,2) > 5 )) print }'
요구 사항에 따라 다음 섹션을 변경할 수 있습니다. 예를 들어 5시간.
dateee-substr($4,1,2) > 5 )
답변4
ps -o etime
POSIXly 및 C/POSIX 로케일에서는 에 의존할 수 있어야 합니다 [dd-]hh:mm:ss
. 따라서 최소 6시간 동안 실행된 프로세스는 0이 아닌 dd-
부분이 있거나 해당 hh
부분이 06보다 큰 프로세스가 됩니다.
LC_ALL=C ps -Ao etime,pid |
LC_ALL=C awk '$1 ~ /[1-9].*-|([1-9].|0[6-9]):..:/ {print $2}'
6시간 이상 실행된 프로세스의 pid가 보고됩니다.
프로세스는 수명 동안 여러 명령을 실행할 수 있으며 종종 실행합니다.