cputime의 출력을 ps로 형식화합니다.

cputime의 출력을 ps로 형식화합니다.

나는 일정 기간 동안 프로세스의 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)자세한 내용은 매뉴얼 페이지를 참조하세요.

관련 정보