프로세스 생성을 모니터링하기 위해 커널이 할당한 마지막 PID를 주기적으로 쓰고 싶습니다.어느파일 타임스탬프가 있는 시스템의 프로세스(PID 모니터에 의해 생성된 프로세스뿐만 아니라)(추가 프로세스 생성을 방지하려면 데몬을 사용) 어떤 언어든 가능하지만 POSIX 셸에서는 이것이 가능해야 한다고 생각합니다.
답변1
그러면 Bash에서 매초마다 타임스탬프와 마지막 PID 파일이 저장됩니다.ns_last_pid
시스템 제어:
이 sysctl을 사용하여 작업의 현재 pid 네임스페이스에 할당된 마지막 pid입니다.
old=""
while read < /proc/sys/kernel/ns_last_pid
do
if [ "$REPLY" != "$old" ]
then
printf '%(%s)T %d\n' -1 "$REPLY"
old=$REPLY
fi
read -t 1 || true
done > pids.log
질문:
/proc/sys/kernel/ns_last_pid
오직리눅스 3.3에서 사용 가능그리고 최신- 지정자
printf
%(fmt)T
만배쉬 4.2에서 사용 가능그리고 최신 - POSIX
read
그러한 옵션은 없습니다-t
. - 추가 PID를 사용하므로 내장되지 않은 기능을
sleep
사용할 수 없습니다 .cat
답변2
POSIX는 커널이 할당한 마지막 PID를 얻는 방법을 제공하지 않으므로 이식 가능한 답변을 제공할 수 없습니다.
이것은 dtrace를 구현하는 모든 시스템(Solaris, FreeBSD, NetBSD, Mac OS X, 최신 UEK가 포함된 Oracle Linux 및 기타 유사한 Illumos 기반 운영 체제, 최신 UEK가 포함된 Linux)에서 작동해야 하는 원라이너입니다.dtrace4linux)
# dtrace -qn 'proc:::exec-success { printf("%Y - %d\n",walltimestamp,pid); }'
2013 May 15 00:48:47 - 1276
2013 May 15 00:48:49 - 1277
2013 May 15 00:48:52 - 1278
편집하다:
Linux에서는 또 다른 옵션을 사용하는 것입니다.시스템 수도꼭지가능한 경우 이 명령(테스트되지 않음)은 다음과 유사한 출력을 제공해야 합니다.
# stap -e 'probe syscall.execve { printf("%s - %d\n",ctime(gettimeofday_s()),pid()); }'