리눅스 프로세스의 가동 시간을 찾는 방법


69

주어진 리눅스 프로세스의 가동 시간을 어떻게 찾을 수 있습니까?

ps aux | grep gedit | grep -v grep

프로세스가 시작된 시간을 포함하여 많은 정보를 제공합니다. 특히 프로세스의 가동 시간을 밀리 초 단위로 반환하는 스위치를 찾고 있습니다.

감사

답변:


113

"가동 시간"에는 몇 가지 의미가 있으므로 다음은 유용한 명령입니다.

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= 명령을 다시 실행합니다. 이번에는 제공된 모든 옵션과 인수가 포함됩니다.


1
좋은. 나는 etimes나 자신을 선호 합니다-초 단위의 경과 시간-그래서 기계를 읽을 수 있습니다
Asfand Qazi

1
문제는 밀리 초 단위의
yohann.martineau

불행히도 busybox 1.29.3은 etime의 형식을 깨뜨 렸으므로 구문 분석에 의존하지 마십시오.
Danny Dulai

10

에서 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

이것은 현재 커널에서 더 이상 작동하지 않는 것 같습니다.
goertzenator 2016 년

7

나는 당신이 그냥 실행할 수 있다고 생각합니다 :

$ 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

4

그런 간단한 일이 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"

3

예, 너무 오래되었지만 너무 어려운 것들. 위의 제안 된 "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

이것은 오래된 시스템에서 정말 좋은 방법입니다. 감사합니다 :)
RobotJohnny

busybox 1.29.3이 형식을 변경했기 때문에 etime의 출력을 구문 분석하지 마십시오. 대신 stat + / proc 메소드를 사용하십시오
Danny Dulai

-1
[root@ip-x-x-x-x ec2-user]# ps -p `pidof java` -o etimes=
 266433

pidof java => Java 프로세스의 프로세스 ID

etimes= => 초 단위이며 '='는 헤더를 제거하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.