프로세스가 시작된시기


31

프로세스가 언제 시작되었는지 알기 위해 첫 번째 추측은 /proc/<pid>/cmdline마지막으로 작성 / 수정 된 시간을 확인하는 것이 었습니다.

ps또한 START필드를 보여줍니다 . 나는이 두 가지 출처가 동일 할 것이라고 생각했다. 때때로 그들은 동일하지 않습니다. 어떻게 그럴 수 있니?


답변:


44

Linux에서는 최소한 다음을 수행 할 수도 있습니다.

ps -o lstart= -p the-pid

더 유용한 시작 시간을 갖기 위해

그러나 프로세스 가 시작된 시간 이며 현재 실행중인 명령 이 호출 된 시간 일 필요는 없습니다 . 프로세스는 일생 동안 둘 이상의 명령을 실행할 수 있습니다 (일반적으로 수행합니다). 명령은 때때로 다른 프로세스를 생성합니다.

/procLinux 에서 파일의 mtimes (적어도)는 일반적으로 해당 파일이 인스턴스화 된 날짜이며, 처음 파일에 액세스하거나 디렉토리 내용을 나열하려고 시도한 날짜입니다.

예를 들어 :

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

확장 /proc/$$/xx*하면 셸 /proc/$$에서 cmdline파일을 인스턴스화 한 내용을 읽었습니다 .

참조 : 소켓 / PROC // FD의 타임 스탬프를


11

proc 은 가상 파일 시스템이므로 파일 상태 정보에 의존하지 않습니다.

프로세스의 시작 시간은 / proc / PID / stat22에 있습니다. 시스템 부팅 후 지프에 제공됩니다. 이것을 초로 변환하려면 대부분의 시스템에서 sysconf(_SC_CLK_TCK)100 으로 나눠야합니다 (모두는 아닙니다!).

시스템 부팅 시간을 얻으려면 현재 가동 시간 (초)을 / proc / uptime 의 첫 번째 값으로 결정하십시오 .

이 두 숫자를 사용하면 두 번째 숫자에서 첫 번째 숫자를 빼고 프로그램을 시작한 후 몇 초가 지났습니까?

예 ( pidgin의 경우 ) :

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

참고 :이 간단한 예제는 여러 pidofPID를 반환하면 작동하지 않습니다 .


proc / <pid> / cmdline이 언제 작성되는지에 대한 아이디어가 있습니까? 해당 문제에 대한 proc / <pid> 항목 중 하나입니다.
Swair

2
일반적으로 이러한 파일은 읽을 때마다 커널에 의해 동적으로 생성되며 대부분 동적 컨텐츠를 갖습니다. cmdline 은 그렇지 않지만 프로세스 시작시 한 번 작성해야하며 다시는 만지지 않아야한다는 공식 정책이 있다고 상상할 수 없습니다.
scai

당신은 "된 getconf의 CLK_TCK"를 실행하여 명령 줄에서 _SC_CLK_TCK 값을 얻을 수 있습니다
oᴉɹǝɥɔ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.