문제의 관점에서여기pidof
, OP는 쉘 스크립트에서 프로세스의 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
답변1
Linux 관련 답변:
perf-tools에는모니터링 실행그것이 바로 그것이 하는 일입니다. ftrace와 같은 다양한 Linux 관련 기능을 사용합니다. 데비안에서는 다음 위치에 있습니다.성능 도구가 불안정합니다.팩.
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
이 작업을 수행하는 휴대용 방법이 있는지 의심됩니다.
답변2
거기올바른 길TM이를 수행하는 것은 실제로 실행 중인 시스템과 커널에 따라 크게 달라집니다.DTraceSolaris, Free/NetBSD 및 Linux에서 실행해야 합니다.
특히 Linux의 경우 ftrace(컴파일 시 활성화해야 함 - 일반적으로 이 경우) 또는 netlink를 통한 proc 이벤트를 사용할 수 있습니다.그래서 대답은질문에 대한 자세한 내용(투표하는 것을 잊지 말고 답변 점수를 수락하세요. ~30 대 0이 흥미로워 보입니다). 가난한 사람의 추적기는 구현이 가능할 수도 있습니다 strace -eexec,fork
(불합리한 오버헤드가 있음에도 불구하고).