생성되는 pid 및 프로세스 이름 인쇄 . 물론 새로운 프로세스가

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(불합리한 오버 헤드가 있지만) 가난한 사람의 추적 프로그램을 사용하여 구현할 수 있습니다 .


답변