주어진 리눅스 프로세스의 가동 시간을 어떻게 찾을 수 있습니까?
ps aux | grep gedit | grep -v grep
프로세스가 시작된 시간을 포함하여 많은 정보를 제공합니다. 특히 프로세스의 가동 시간을 밀리 초 단위로 반환하는 스위치를 찾고 있습니다.
감사
주어진 리눅스 프로세스의 가동 시간을 어떻게 찾을 수 있습니까?
ps aux | grep gedit | grep -v grep
프로세스가 시작된 시간을 포함하여 많은 정보를 제공합니다. 특히 프로세스의 가동 시간을 밀리 초 단위로 반환하는 스위치를 찾고 있습니다.
감사
답변:
"가동 시간"에는 몇 가지 의미가 있으므로 다음은 유용한 명령입니다.
ps -eo pid,comm,lstart,etime,time,args
이 명령은 몇 가지 다른 시간 관련 열이있는 모든 프로세스를 나열합니다. 다음과 같은 열이 있습니다.
PID COMMAND STARTED ELAPSED TIME COMMAND
PID
= 프로세스 ID
우선 COMMAND
= 옵션이없고 인수가없는 명령 이름 만
STARTED
= 프로세스가 시작된 절대 시간 = 프로세스가 시작된
ELAPSED
이후의 경과 시간 ( 벽 시계 시간 ), 형식 [[dd-] hh :] mm : ss
TIME
= 누적 CPU 시간, "[dd-] hh : mm : ss"형식
second COMMAND
= 명령을 다시 실행합니다. 이번에는 제공된 모든 옵션과 인수가 포함됩니다.
에서 ps
와 같이 제한된 버전이있는 경우 busybox
의 타임 스탬프를 보면 프로세스 시작 시간을 얻을 수 있습니다 /proc/<PID>
. 예를 들어 보려는 pid가 55 인 경우 ...
# ls -al /proc | grep 55
dr-xr-xr-x 7 root root 0 May 21 05:53 55
... 그리고 현재 날짜와 비교하십시오 ...
# date
Thu May 22 03:00:47 EDT 2014
나는 당신이 그냥 실행할 수 있다고 생각합니다 :
$ stat /proc/1234
1234는 프로세스 ID입니다.
같은 시간 분 초에 시작되었지만 동일한 밀리 초가 아닌 두 프로세스가있는 예 :
$ stat /proc/9355
...
Access: 2017-11-13 17:46:39.778791165 +0100
Modify: 2017-11-13 17:46:39.778791165 +0100
Change: 2017-11-13 17:46:39.778791165 +0100
$ stat /proc/9209
...
Access: 2017-11-13 17:46:39.621790420 +0100
Modify: 2017-11-13 17:46:39.621790420 +0100
Change: 2017-11-13 17:46:39.621790420 +0100
그런 간단한 일이 5 년 후에 제대로 답변되지 않습니까?
나는 당신이 정확하게 밀리 초를 얻을 수 있다고 생각하지 않습니다. 예. 당신이 볼 경우 man procfs
볼 /proc/$$/stat
"시계 틱"에 startime로 필드 (22)이있는, 당신은보다 정확한 뭔가있을 것입니다 만, 클럭 틱 ( '벽 시계 시간'을 기준으로) 완벽하게 일정한 속도로가는 것입니다하지 않습니다 꺼져 ... 잠을 자고 특정 것들 (ntpd 추측)이 그것을 상쇄합니다. 예를 들어, 가동 시간이 8 일이고 절대 잠들지 않은 ntpd를 실행하는 시스템 dmesg -T
에서 같은 문제가 발생합니다 (내 생각에는 ...). 여기서 볼 수 있습니다.
# date; echo h > /proc/sysrq-trigger; dmesg -T | tail -n1 ; date
Fri Mar 3 10:26:17 CET 2017
[Fri Mar 3 10:26:16 2017] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) terminate-all-tasks(e) memory-full-oom-kill(f) kill-all-tasks(i) thaw-filesystems(j) sak(k) show-backtrace-all-active-cpus(l) show-memory-usage(m) nice-all-RT-tasks(n) poweroff(o) show-registers(p) show-all-timers(q) unraw(r) sync(s) show-task-states(t) unmount(u) force-fb(V) show-blocked-tasks(w)
Fri Mar 3 10:26:17 CET 2017
몇 초입니다 :
# example pid here is just your shell
pid=$$
# current unix time (seconds since epoch [1970-01-01 00:00:00 UTC])
now=$(date +%s)
# process start unix time (also seconds since epoch)
# I'm fairly sure this is the right way to get the start time in a machine readable way (unlike ps)...but could be wrong
start=$(stat -c %Y /proc/"$pid")
# simple subtraction (both are in UTC, so it works)
age=$((now-start))
printf "that process has run for %s seconds\n" "$age"
예, 너무 오래되었지만 너무 어려운 것들. 위의 제안 된 "stat"방법으로 시도했지만 어제 PID proc dir을 "touch"한 경우 어떻게해야합니까? 이것은 내 오래된 프로세스가 어제의 타임 스탬프와 함께 표시됨을 의미합니다. 아냐, 내가 필요한 것 :(
최신 버전에서는 간단합니다.
ps -o etimes -p <PID>
ELAPSED
339521
저것과 같이 쉬운. 시간은 초 단위입니다. 필요한 것은 무엇이든하십시오. 오래된 상자가 있으면 시간이 없기 때문에 상황이 더 어려워집니다. 하나는 다음에 의존 할 수 있습니다.
ps -o etime -p <PID>
ELAPSED
76-03:26:15
dd-hh : mm : ss 형식이므로 "조금"이상하게 보입니다. 추가 계산에는 적합하지 않습니다. 몇 초 만에 선호했을 것이므로이 것을 사용했습니다.
ps -o etime -p <PID> --no-headers | awk -F '(:)|(-)' 'BEGIN{a[4]=1;a[3]=60;a[2]=3600;a[1]=86400;s=0};{for (i=NF;i>=1;i--) s=s+a[i]*$i}END{print s}'
339544
etimes
나 자신을 선호 합니다-초 단위의 경과 시간-그래서 기계를 읽을 수 있습니다