나는 일정 기간 동안 프로세스의 CPU 사용량을 모니터링할 수 있는 스크립트를 작성하려고 합니다(그래프 생성).
이것은 내가 지금까지 사용하고 있는 명령이다
ps -p $PROCID -o cputime,etimes
내 유일한 관심사는 CPUTime의 출력이 다음과 같은 것 같다는 것입니다. [dd]hh:mm
(또는 이와 비슷한 것, 지금은 기억할 수 없습니다)
경과 시간을 초 단위로 가져오기 위해 etime -> etimes와 같이 CPUtime을 초 단위로 형식화하는 방법이 있습니까?
편집: 이것은 내가 현재 받는 출력입니다.
2-03:01:33 2653793
첫 번째 매개변수를 일-시:분:초가 아닌 초 형식으로 지정하고 싶습니다.
답변1
그러면 처음 시간이 초로 변환됩니다.
ps -p $PROCID -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
예를 들어 ps 명령은 다음을 생성합니다.
$ ps -p 5403 -o cputime,etimes
TIME ELAPSED
01:33:38 1128931
이 awk
명령은 다음을 처리하고 반환합니다.
ps -p 5403 -o cputime,etimes | awk -F'[: ]+' '/:/ {t=$3+60*($2+60*$1); print t,$NF}'
5618 1128931
설명하다
-F'[: ]+'
이는 awk에게 콜론과 공백을 필드 구분 기호로 처리하도록 지시합니다. 이렇게 하면 시, 분, 초가 별도의 필드로 표시됩니다.
/:/ {t=$3+60*($2+60*$1); print t,$NF}
초기
/:/
제한 코드는 콜론이 포함된 줄에만 적용됩니다. 그러면 머리글 행이 제거됩니다. 초는 시, 분, 초로 계산됩니다t=$3+60*($2+60*$1)
. 그러면 결과 값이t
경과 시간과 함께 인쇄됩니다.
처리일수
일, 시, 분, 초가 생성 되면 ps
다음과 같습니다.
2-03:01:33
그런 다음 대신 다음 코드를 사용하십시오.
ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ {t=$4+60*($3+60*($2+24*$1)); print t,$NF}'
날짜가 출력에 추가되거나 추가되지 않을 수 있는 경우 다음 명령 조합을 사용하십시오.
ps -p $PROCID -o cputime,etimes | awk -F'[-: ]+' '/:/ && NF==5 { t=$4+60*($3+60*($2+24*$1)); print t,$NF} /:/ && NF==4 {t=$3+60*($2+60*$1); print t,$NF}'
답변2
게임에 awk를 도입하고 싶지 않다면 순수한 bash 솔루션을 사용할 수 있습니다(t_str에는 형식 문자열이 포함되어 있고 t_sec에는 초 단위의 디코딩 시간이 포함되어 있습니다).
# Decode the CPU time format [dd-]hh:mm:ss.
IFS="-:" read c1 c2 c3 c4 <<< "$t_str"
if [ -n "$c4" ]
then
t_sec=$((10#$c4+60*(10#$c3+60*(10#$c2+24*10#$c1))))
else
t_sec=$((10#$c3+60*(10#$c2+60*10#$c1)))
fi
답변3
어떤 운영 체제에 적용되는지 지정하지 않았습니다. Linux이고 특정 프로세스를 모니터링하는 데 관심이 있다면 구문 분석할 가치가 더 높다고 생각할 수 있습니다 /proc/$PROCID/stat
. proc(5)
자세한 내용은 매뉴얼 페이지를 참조하세요.