it-swarm-ko.tech

프로세스가 얼마나 오래 실행되었는지 확인하는 방법은 무엇입니까?

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

250
tshepang

procps(-ng)ps가있는 Linux (및 POSIX에서 지정하므로 대부분의 다른 시스템) :

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)를 찾는 것은 엄청나게 복잡합니다. procps 패키지의 sysinfo.c 주석에서 A) 커널 헤더 파일을 포함하고 다른 커널을 사용하는 경우 다시 컴파일 할 수 있습니다. B) posix sysconf() 함수를 사용하면 안타깝게도 C 라이브러리에 컴파일 된 하드 코딩 된 값을 사용하거나 C) 커널에게 물어보십시오.하지만 공식적인 인터페이스는 없습니다. 따라서 ps 코드에는 올바른 값을 결정하는 일련의 kludge가 포함됩니다. 와.

따라서 ps가이 모든 것을 수행하는 것이 편리합니다. :)

@ 336_ 사용자가 지적한 것처럼 Linux에서는 이식성이 없으며 stat 명령을 사용하여 /proc/$$ 디렉토리의 액세스, 수정 또는 상태 변경 날짜를 확인할 수 있습니다 (여기서 다시 $$가 관심있는 과정입니다). 세 숫자는 모두 같아야하므로

stat -c%X /proc/$$

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

324
mattdm

가지고 다닐 수 있는:

% 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 시간이 지겹다. Shell에서 Jiffy 값을 찾는 방법을 모릅니다. 시작 시간은 부팅 시간을 기준으로합니다 (/proc/uptime).

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

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

19
mezi

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

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

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

$ ps -eo pid,etime

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

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

( Edit : 위의 명령에 대한 구문이 더 짧은 것으로 나타났습니다. mattdm 's answer 참조)

13
Michael Mrozek

이것이 아직 제안되지 않은 이유를 잘 모르겠습니다. Linux의 경우 PID의/proc/[nnn] 디렉토리를 stat() 할 수 있습니다.

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

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

NOTE 이것은 not FreeBSD에서 /usr/compat/linux/proc와 작동합니다; 반환 된 액세스/수정/상태 변경 시간은 현재 시간이고 출생 시간은 UNIX Epoch입니다. 당신이 저에게 물어 보면 지원이 존재하지 않습니다.

5
i336_

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

[0] % 수면 시간 20

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

2
slashdot

$ 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입니다.

2
Terry wang

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

1
Shardj

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

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

어디 13494는 프로세스 pid입니다

1
bobbins