~처럼프로세스가 얼마나 오랫동안 실행되었는지 확인하는 방법은 무엇입니까?, 나는 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_TCK
USER_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 +%s
epoch 이후 두 번째 현재 날짜입니다.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
}