here 질문 에서 OP는 pidof
쉘 스크립트를 사용하여 프로세스의 pid를 반복적으로 폴링하려고합니다 . 물론 새로운 프로세스가 pidof
초당 여러 번 프로그램을 시작해야하기 때문에 비효율적 입니다 (이 문제가 CPU 스파이크의 원인이라는 것을 모르겠지만 가능성이 높습니다).
일반적으로 쉘 스크립트에서 이러한 종류의 문제를 해결하는 방법은 필요한 데이터를 출력하고 stdout
필요한 경우 텍스트 처리를 수행 하는 단일 프로그램으로 작업하는 것입니다 . 여기에는 더 많은 프로그램을 동시에 실행하는 것이 포함되지만 폴링 목적으로 새 프로세스가 지속적으로 생성되지 않기 때문에 CPU를 덜 사용하게됩니다.
위의 질문에 대해 하나의 해결책은 프로세스의 이름과 pid를 생성 할 때 출력하는 프로그램을 갖는 것입니다. 그런 다음 다음과 같은 작업을 수행 할 수 있습니다.
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
이것의 문제점은 더 근본적인 질문을 제기한다는 것입니다 .pid와 프로세스 이름을 만들 때 어떻게 인쇄 할 수 있습니까?
이 프로그램 ps-watcher
의 문제는 perl
반복적으로 실행 되는 스크립트 일 뿐이 ps
므로 실제로 문제를 해결하지 못한다는 것입니다. 다른 옵션은 auditd
로그를 통해 직접 처리 한 경우 사용할 수 있는 옵션입니다 tail -f
. 이상적인 솔루션은 이것보다 더 간단하고 휴대하기 쉽지만 auditd
최선의 선택이라면 솔루션 을 받아 들일 것입니다.
답변
리눅스 고유의 답변 :
perf-tools에는 정확히 이것을 수행 하는 execsnoop 이 포함되어 있습니다 . ftrace와 같은 다양한 Linux 관련 기능을 사용합니다. 데비안에서는 perf-tools-sstable 패키지에 있습니다.
man cat
다른 터미널에서 실행하는 예 :
root@Zia:~# execsnoop
TIME PID PPID ARGS
17:24:26 14189 12878 man cat
17:24:26 14196 14189 tbl
17:24:26 14195 14189 preconv -e UTF-8
17:24:26 14199 14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8
17:24:26 14200 14189 less
17:24:26 14201 14199 locale charmap
17:24:26 14202 14199 groff -mtty-char -Tutf8 -mandoc
17:24:26 14203 14202 troff -mtty-char -mandoc -Tutf8
17:24:26 14204 14202 grotty
나는 이것을 할 수있는 휴대용 방법이 의심 스럽다.
답변
이 작업을 수행하는 올바른 방법 TM 은 실제로 실행중인 시스템과 커널에 따라 크게 다릅니다. DTrace 는 Solaris, Free / NetBSD 및 Linux에서 작동해야합니다.
특히 리눅스의 경우 ftrace (컴파일 시간에 활성화해야 함) 또는 netlink를 통한 proc 이벤트를 사용할 수 있습니다- 자세한 내용은 문제에 대한 SO 답변 을 참조하십시오 (그리고 점수를 매기십시오 ~ 허용되는 답변에 대한 30 대 0은 웃겨 보입니다.) strace -eexec,fork
(불합리한 오버 헤드가 있지만) 가난한 사람의 추적 프로그램을 사용하여 구현할 수 있습니다 .