답변:
ps
from 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.c
procps 패키지의 주석에서 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 명령 실행 타이밍이 정확도를 방해하므로 프로세스 감사 방식을 사용해야합니다.
=
헤더가 표시되지 않습니다. 없이 시도하거나 시도ps -p $$ -o etime="Silly Header Here"
etimes
그것이 기계가 읽을 수있는 것처럼 나 자신을 선호합니다
sysconf()
하고 따라서 C 라이브러리에서 하드 코딩 된 값을 제공합니다. 그렇지 않습니까?
가지고 다닐 수 있는:
% 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
기준으로합니다.
sysinfo.c
procps 패키지 의 주석에서 a) 커널 헤더 파일을 포함하고 다른 커널을 사용하는 경우 다시 컴파일하십시오. b) 슬프게도 하드 코딩 된 값을 사용하여 posix sysconf () 함수를 사용하십시오 c 라이브러리 또는 c) 커널에게 물어 보면 공식 인터페이스가 없습니다. 따라서 코드에는 올바른 값을 결정하는 일련의 kludge가 포함됩니다. 와.
ps
맨 상태 time
"누적 CPU 시간"입니다. OP가 찾고 있던 것은 etime
"프로세스가 시작된 이후의 경과 시간" 이라고 생각합니다 . pubs.opengroup.org/onlinepubs/000095399/utilities/ps.html
etime
그래도 적어도 지원 합니다.
ps -eo pid,comm,cmd,start,etime | grep -i X
X는 프로세스의 이름입니다
ps -o pid,comm,cmd,start,etime -p X
PID X를 보려고
ps
-o
출력 형식을 지정 하는 옵션을 사용하며 사용 가능한 열 중 하나는 etime
입니다. 매뉴얼 페이지에 따르면 :
etime-프로세스가 시작된 후 경과 된 시간 ([dd-] hh :] mm : ss 형식)
따라서 모든 프로세스의 PID 및 경과 시간을 얻기 위해 이것을 실행할 수 있습니다.
$ ps -eo pid,etime
특정 PID (예 : 12345)의 경과 시간을 원하는 경우 다음과 같이 할 수 있습니다.
$ ps -eo pid,etime | awk '/^12345/ {print $2}'
( 편집 : 위의 명령에 대한 구문이 더 짧습니다. mattdm의 답변 참조 )
확실이 아직 제시되지 않은 이유 : 리눅스에서 할 수 있습니다 stat()
귀하의 PID의 / proc 디렉토리 / [NNN] 디렉토리.
이 동작은 프로세스 시작 시간을 반환하도록 설계되었으며, 높은 해상도에서 수행 할 수 있으며 커널이 관련 정보를 간단하게 확인할 수 있으므로 지프 해킹 없이도 커널이 정확하게 수행 할 수 있습니다. 액세스, 데이터 수정 및 상태 변경 필드는 모두 프로세스 시작 시간을 반환합니다.
무엇보다도 stat(1)
쉘에서 사용하거나 stat(2)
$ favorite_programming_language에서 적절한 바인딩을 사용할 수 있으므로 외부 프로세스를 시작할 필요조차 없습니다.
참고 이 않습니다 하지 작업 /usr/compat/linux/proc
FreeBSD의에; 반환 된 액세스 / 수정 / 상태 변경 시간은 현재 시간이고 출생 시간은 UNIX 시대입니다. 당신이 저에게 물어 보면 지원이 존재하지 않습니다.
stat /proc/4480
이것은 당신에게 프로세스의 탄생, 변경, 수정 및 접근 날짜를 줄 것입니다. 프로세스 ID가 필요한 경우 "top"
$ 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입니다.
초 단위의 시간 경과 : expr $(date +"%s") - $(stat -c%X /proc/<PID HERE>)
date +%s --date="now - $( stat -c%X /proc/$$
etime=
오타는?etime
맨 페이지 에서만 찾을 수 있습니다 .