프로세스 실행 시간을 초 단위로 가져옵니다.

프로세스 실행 시간을 초 단위로 가져옵니다.

~처럼프로세스가 얼마나 오랫동안 실행되었는지 확인하는 방법은 무엇입니까?, 나는 BusyBox를 사용하여 sh(대신 bash) 임베디드 Linux 시스템에서 프로세스의 실행 시간(초)을 얻으려고 합니다. 차이점은 mm:ss 형식이 아닌 순수한 초를 원한다는 것입니다.

결과에서 구문 분석할 수 있지만 mm:ss를 초로 변환 ps할 수는 없습니다 . 디버깅 도움말을 expr사용하면 set -vx명령이 유효한 것을 볼 수 있지만 expr구문 오류로 인해 실패합니다. 복사해서 붙여넣으면 잘 됩니다.

추가 진단을 위해 이 명령을 실행한 후:

root@embedded:~# set -vx

나는 다음을 입력합니다:

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\\* 60 + \2/")

그리고 이런 응답을 받았습니다:

$(/opt/bin/busybox ps -o pid,etime,time | grep 1156 | sed "s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\\* 60 + \2/")
+ /opt/bin/busybox ps -o pid,etime,time
+ grep 1156
+ sed s/ *[0-9]\+ \+\([0-9]\+\):\([0-9]\+\) .*/\/opt\/bin\/busybox expr \1 \\* 60 + \2/
+ /opt/bin/busybox expr 2 \* 60 + 03
expr: syntax error
root@embedded:~#

나는 또한 여러 단계 \의 탈출을 시도했습니다 ''.

*이스케이프를 expr명령줄 에 전달 하려면 어떻게 해야 합니까 ?

답변1

eval이 경우 도움이 될 수 있습니다 ...

~ $ $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ expr 1 \* 2
expr: syntax error
~ $ eval $(echo expr 1 \\* 2)
+ echo expr 1 \* 2
+ eval expr 1 \* 2
+ expr 1 * 2
2

그러나 Linux에서 찾는 것이 더 나을 수도 있습니다 /proc/$pid/stat.

pid=1155
hz=$(getconf CLK_TCK)
uptime=$(awk '{print $1}' < /proc/uptime)
starttime=$(awk '{print $22}' < /proc/$pid/stat)
echo $(( ${uptime%.*} - $starttime / $hz ))

사용할 수 없는 경우 시스템의 (또는 ) 값을 /usr/bin/getconf조회해야 합니다 . 대부분의 경우 100이라고 가정할 수 있을 것 같습니다.CLK_TCKUSER_HZ

답변2

당황스럽게도 생각만큼 철저하게 테스트하지 않은 것 같습니다. 두 개의 이스케이프 문자( )만 포함하도록 질문에 게시한 내용을 수정하면 \\*제대로 작동하는 것으로 나타났습니다.

root@embedded:~# $(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\* 60 + \2/p")
$(/opt/bin/busybox ps -o pid,etime | sed -n "s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \\* 60 + \2/p")
+ /opt/bin/busybox ps -o pid,etime
+ sed -n s/ *1155 \+\([0-9]\+\):\([0-9]\+\).*/expr \1 \* 60 + \2/p
+ expr 293 * 60 + 54
17634

나는 또한 이 방법을 grep(글로벌sed-n 's///p'N오 인쇄해, 그럼일치하면 인쇄됩니다.)

다시 시도할 수 있게 해준 @yaegashi에게 감사드립니다 \\

답변3

프로세스가 16752라고 가정하면 (알 수 있을 것 같습니다)

expr $(date +%s) - $(stat -c %Y /proc/16752/environ )

어디

  • date +%sepoch 이후 두 번째 현재 날짜입니다.
  • stat -c %Y /proc/16752/environ/proc/16752/environ의 "생성 날짜"는 proc #16752가 시작된 시간입니다.

편집하다:

  • 어쩌면 /proc/$PID/environ잘못된 더미 파일이므로 /proc/$PID/exe대신 사용해야 합니다.

  • 호스트의 시간이 변경되면 결과 ps -p $PID -h -o etime와 타임스탬프가 모두 /proc/$PID/exe잘못될 수 있습니다. (확인 방법을 모르겠습니다).

답변4

이것은 0-00:00:00 출력을 초로 변환하는 awk 스크립트입니다. 사용 방법은 다음과 같습니다.

ps -eo pid,time,user,comm | awk '{print $1"|"$2"|"$3"|"$4$5$6$7$8$9$10}' | awk -f _os_return_process_time_in_seconds.awk

여기에 스크립트가 있습니다. 그냥 다른 용도로 쓴 겁니다. 여전히 문제가 있을 수 있습니다.

BEGIN {
   FS="|"
}

{
   pid=$1
   time=$2
   user=$3
   comm=$4
   split_count=split($2,days_array,"\-")
   if ( split_count == 2 ) {
      days=days_array[1]
      hr_min_sec=days_array[2]
   }
   else {
      days=0
      hr_min_sec=days_array[1]
   }
   split_count=split(hr_min_sec,hr_min_sec_array,":")
   if ( split_count == 3 ) {
      hours=hr_min_sec_array[1]
      minutes=hr_min_sec_array[2]
      seconds=hr_min_sec_array[3]
   }
   else if ( split_count == 2 ) {
      hours=0
      minutes=hr_min_sec_array[1]
      seconds=hr_min_sec_array[2]
   }
   else if ( split_count == 1 ) {
      hours=0
      minutes=0
      seconds=hr_min_sec_array[1]
   }
   total_seconds=(days*24*60*60)+(hours*60*60)+(minutes*60)+(seconds)
   print pid"|"total_seconds"|"user"|"comm
}

관련 정보