프로세스가 얼마나 오래 실행되었는지 확인하는 방법


243

모니터링 앱에서 프로세스를 시작 하여이 작업을 피하고 싶습니다.

답변:


311

psfrom procps(-ng)(및 POSIX에 의해 지정되므로 대부분의 다른 시스템)이 있는 Linux 에서 :

ps -o etime= -p "$$" 

$$확인할 프로세스의 PID는 어디에 있습니까 ? 이것은 경과 시간을 형식으로 반환합니다 [[dd-]hh:]mm:ss.

사용은 -o etime말한다 ps방금 경과 시간 필드를 원하고 있다는 =그 말에이 헤더를 억제 (, 당신은 말한다 라인 수없이 ELAPSED다음과 다음 줄의 시간을, 당신이 시간에 하나 개의 라인을 얻을 수로) .

또는 Linux 또는 FreeBSD 9.0 이상 (및 기타)에서 최신 버전의 procps-ng 도구 모음 (3.3.0 이상)을 사용하는 경우 다음을 사용하십시오.

ps -o etimes= -p "$$"

(와 함께 추가됨 s) 시간을 초로 형식화하면 스크립트에서 더 유용합니다.

Linux에서 ps프로그램은이 /proc/$$/stat필드를 가져 오며 여기서 필드 중 하나 (참조 man proc)는 프로세스 시작 시간입니다. 불행히도 이것은 시스템 부팅 이후 jiffies (Linux 커널에서 사용되는 임의의 시간 카운터) 시간으로 지정됩니다. 따라서 시스템이 부팅 된 시간 (부터 /proc/stat),이 시스템의 초당 지프 수 를 결정한 다음 유용한 형식으로 경과 시간을 얻기 위해 수학을 수행해야합니다.

HZ의 가치 (즉, 초당 jiffies)를 찾는 것은 엄청나게 복잡합니다. sysinfo.cprocps 패키지의 주석에서 A) 커널 헤더 파일을 포함하고 다른 커널을 사용하는 경우 다시 컴파일 할 수 있습니다 .B) posix sysconf()함수를 사용하십시오 . 슬프게도 C 라이브러리에 컴파일 된 하드 코딩 된 값을 사용하거나 C) 커널에게 물어 보지만 공식 인터페이스는 없습니다. 따라서 ps코드에는 올바른 값을 결정하는 일련의 kludge가 포함됩니다. 와.

그래서 ps당신을 위해 그 일을하는 것이 편리 합니다. :)

@ 336_ 사용자가 지적했듯이 Linux에서는 이식성이 없으므로 stat명령을 사용하여 디렉토리에 대한 액세스, 수정 또는 상태 변경 날짜를 볼 수 있습니다 /proc/$$(여기서 $$관심있는 프로세스 임). 세 숫자는 모두 같아야하므로

stat -c%X /proc/$$

$$에포크 이후 몇 초 안에 프로세스가 시작된 시간을 제공합니다 . 경과 시간을 얻기 위해 현재 시간에서 빼기 위해 수학을 수행해야하기 때문에 여전히 원하는 것은 아닙니다 date +%s --date="now - $( stat -c%X /proc/$$ ) seconds". 한 가지 가능한 장점은 같은 긴 형식의 출력을 사용하는 경우이다 -c%x대신을 -c%X, 당신은 전체 수의 초보다 더 큰 해상도를 얻을. 그러나 필요한 경우 stat 명령 실행 타이밍이 정확도를 방해하므로 프로세스 감사 방식을 사용해야합니다.


1
안녕하세요! 인가 etime=오타는? etime맨 페이지 에서만 찾을 수 있습니다 .
Kent Pawar

16
@KentPawar 오타가 아닙니다. 비어 있으면 =헤더가 표시되지 않습니다. 없이 시도하거나 시도ps -p $$ -o etime="Silly Header Here"
mattdm

4
ps -p $ (pgrep find) -o etime =
mafrosis

1
좋은. 나는 etimes그것이 기계가 읽을 수있는 것처럼 나 자신을 선호합니다
Asfand Qazi

1
@alexmurray 그것은 단지 호출 sysconf()하고 따라서 C 라이브러리에서 하드 코딩 된 값을 제공합니다. 그렇지 않습니까?
mattdm

36

가지고 다닐 수 있는:

% ps -o stime,time $$
STIME     TIME
Jan30 00:00:06

즉, 해당 셸은 1 월 30 일에 시작되어 총 6 초의 CPU 시간이되었습니다.

이 정보를 얻는 데 더 정확하거나 구문 분석이 가능하지만 이식성이 떨어지는 방법이있을 수 있습니다. ps명령 또는 proc파일 시스템 설명서를 확인하십시오 .

Linux에서이 정보는에 /proc/$pid/stat있습니다.

awk '{print "CPU time: " $14+$15; print "start time: " $22}' /proc/$$/stat

CPU 시간이 지겹다. 껍질에서 지피 값을 찾는 방법을 모릅니다. 시작 시간은 부팅 시간 (에 있음)을 /proc/uptime기준으로합니다.


3
HZ (즉, 초당 jiffies)의 가치를 찾는 것은 엄청나게 복잡합니다! sysinfo.cprocps 패키지 의 주석에서 a) 커널 헤더 파일을 포함하고 다른 커널을 사용하는 경우 다시 컴파일하십시오. b) 슬프게도 하드 코딩 된 값을 사용하여 posix sysconf () 함수를 사용하십시오 c 라이브러리 또는 c) 커널에게 물어 보면 공식 인터페이스가 없습니다. 따라서 코드에는 올바른 값을 결정하는 일련의 kludge가 포함됩니다. 와.
mattdm

1
ps맨 상태 time"누적 CPU 시간"입니다. OP가 찾고 있던 것은 etime"프로세스가 시작된 이후의 경과 시간" 이라고 생각합니다 . pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
rinogo

1
결국 "휴대용"은 아닙니다 : FreeBSD 에서 "ps : stime : 키워드를 찾을 수 없습니다" . etime그래도 적어도 지원 합니다.
n.st

18
ps -eo pid,comm,cmd,start,etime | grep -i X

X는 프로세스의 이름입니다


2
grep -v grep을 추가해야합니다.
Brian

ps -o pid,comm,cmd,start,etime -p XPID X를 보려고
codeforester

13

ps-o출력 형식을 지정 하는 옵션을 사용하며 사용 가능한 열 중 하나는 etime입니다. 매뉴얼 페이지에 따르면 :

etime-프로세스가 시작된 후 경과 된 시간 ([dd-] hh :] mm : ss 형식)

따라서 모든 프로세스의 PID 및 경과 시간을 얻기 위해 이것을 실행할 수 있습니다.

$ ps -eo pid,etime

특정 PID (예 : 12345)의 경과 시간을 원하는 경우 다음과 같이 할 수 있습니다.

$ ps -eo pid,etime | awk '/^12345/ {print $2}'

( 편집 : 위의 명령에 대한 구문이 더 짧습니다. mattdm의 답변 참조 )


5

확실이 아직 제시되지 않은 이유 : 리눅스에서 할 수 있습니다 stat()귀하의 PID의 / proc 디렉토리 / [NNN] 디렉토리.

이 동작은 프로세스 시작 시간을 반환하도록 설계되었으며, 높은 해상도에서 수행 할 수 있으며 커널이 관련 정보를 간단하게 확인할 수 있으므로 지프 해킹 없이도 커널이 정확하게 수행 할 수 있습니다. 액세스, 데이터 수정 및 상태 변경 필드는 모두 프로세스 시작 시간을 반환합니다.

무엇보다도 stat(1)쉘에서 사용하거나 stat(2)$ favorite_programming_language에서 적절한 바인딩을 사용할 수 있으므로 외부 프로세스를 시작할 필요조차 없습니다.

참고 이 않습니다 하지 작업 /usr/compat/linux/procFreeBSD의에; 반환 된 액세스 / 수정 / 상태 변경 시간은 현재 시간이고 출생 시간은 UNIX 시대입니다. 당신이 저에게 물어 보면 지원이 존재하지 않습니다.


stat의 출력에서 ​​정보를 볼 수있는 곳은 어디입니까? 액세스, 수정 및 변경 만 표시됩니다.
tshepang

그 값이 모두 동일하고, 그들이 있습니다 @Tshepang 있는 프로세스 시작 시간. 당신은 여전히 ​​수학을해야하지만, 이것은 내 대답에 명시된대로 지피를 알아 내려고 노력하는 것보다 확실히 낫습니다.
mattdm

당신은 이것을 다음과 같이 부릅니다 : stat /proc/4480이것은 당신에게 프로세스의 탄생, 변경, 수정 및 접근 날짜를 줄 것입니다. 프로세스 ID가 필요한 경우 "top"
user890332

2

당신이 시간을 실행하고 명령을 실행할 수 있다면 당신은 당신이 찾고있는 것을 정확히 얻을 것입니다. 이미 실행중인 명령에 대해서는이 작업을 수행 할 수 없습니다.

[0] % 수면 시간 20

절전 모드 20 0.00s 사용자 0.00s 시스템 0 % CPU 20.014 총


실행중인 프로세스 모니터링이 끝날 때까지 어떻게 수행 할 수 있는지 알고 있습니까?
lrkwz

1

에서 stat생성 된 통계 파일 을보고 proc형식 date을 지정하고 현재 시간에서 빼서 프로세스의 시작 시간을 얻을 수 있습니다 .

echo $(( $(date +%s) - $(date -d "$(stat /proc/13494/stat | grep Modify | sed 's/Modify: //')" +%s) ))

13494프로세스의 pid는 어디에 있습니까


1

$ ps -eo lstart 시작 시간을 얻다

$ ps -eo etime 기간 / 경과 시간을 얻습니다

$ ps -eo pid,lstart,etime | grep 61819
  PID                   STARTED     ELAPSED
  61819 Mon Sep 17 03:01:35 2018    07:52:15

61819는 프로세스 ID입니다.


lstart를 사용하면 문제가 발생할 수 있습니다.- unix.stackexchange.com
slm

1

초 단위의 시간 경과 : expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)


이것은 mattdm이 이미 언급 한 것의 매우 작은 변형 인 것 같습니다. date +%s --date="now - $( stat -c%X /proc/$$
Jeff Schaller

저것은 나의 아주 작은 알파인 도커 인스턴스에서 나를 위해 일하지 않았다. 그래서 나는 이것을 썼다
Shardj
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.