프로세스가 언제 시작되었는지 알기 위해 가장 먼저 추측한 것은 /proc/<pid>/cmdline
마지막 쓰기/수정 시간을 확인하는 것입니다.
ps
필드도 표시됩니다 START
. 두 소스 모두 동일한 것 같아요. 때때로 그들은 동일하지 않습니다. 그게 어떻게 가능하지?
답변1
적어도 Linux에서는 다음과 같이 할 수도 있습니다.
ps -o lstart= -p the-pid
더 유용한 시작 시간을 얻으려면.
하지만 지금은프로세스시작 시간은 반드시 시간이 아닐 수도 있습니다.주문하다현재 호출중입니다. 프로세스는 수명 동안 여러 명령을 실행할 수 있으며 일반적으로 실행합니다. 명령은 때때로 다른 프로세스를 생성합니다.
Linux에서 파일 수정 시간은 /proc
일반적으로 (적어도) 해당 파일이 인스턴스화된 날짜입니다. 이는 해당 파일에 액세스하거나 디렉터리 내용을 나열하려는 첫 번째 시도 날짜입니다.
예를 들어:
$ 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에 있는 소켓의 타임스탬프
답변2
프로세스가상 파일 시스템이므로 파일 상태 정보에 의존하지 않습니다.
이 프로세스의 시작 시간은 다음과 같습니다./proc/PID/통계기둥스물 둘. 시스템 시작 직후에 제공됩니다. 초로 변환하려면 sysconf(_SC_CLK_TCK)
100 으로 나누어야 합니다.최대시스템(그러나 전부는 아닙니다!)
시스템 부팅 시간을 얻으려면 첫 번째 값인 현재 가동 시간(초)을 확인할 수 있습니다./proc/가동시간.
이 두 숫자를 사용하여 두 번째 숫자에서 첫 번째 숫자를 빼면 프로그램을 시작한 이후 경과된 시간(초)을 알 수 있습니다.
예(피진):
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
pidof
참고: 이 간단한 예는 여러 PID가 반환되는 경우 작동하지 않습니다.