생성되는 pid 및 프로세스 이름 인쇄


10

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최선의 선택이라면 솔루션 을 받아 들일 것입니다.


1
흥미로운 점은 pid가 먼저 작성 프로세스 ( 또는 변형) 의 사본 으로 작성된 fork다음 새 프로그램이 exec패밀리 의 구성원을 사용하여 시작 된다는 것 입니다. 따라서 .가 exec*아닌 을 기록하고 싶을 것입니다 fork.
derobert

2
내가 아는 유일한 휴대용 효율적인 방법 은 프로세스가 종료 된 레코드를 작성하는 일반적인 Unix 프로세스 계정을 사용하는 것 입니다. 프로세스가 작성 또는 실행될 때 프로세스를 잡으려면 Linux 감사, systemtap 또는 dtrace와 같은 시스템 별 항목이 필요할 수 있습니다.
Mark Plotnick

위의 질문에 대해 하나의 해결책은 프로세스의 이름과 pid를 생성 할 때 출력하는 프로그램을 갖는 것입니다. – 생성 된대로? 당신이 생각하는 것은 관찰자입니다 (이것은 그들이 웹 브라우저 세계에서 그들을 부르는 것입니다). 파이썬이 "가드 가드"역할을하기에 적합한 지 궁금합니다. 사실 파이썬은 시스템의 내부 작업에 매우 깊이 파고들 수 있습니다 (예 :) dbus.
syntaxerror

1
@syntaxerror DBus는이 경우 시스템의 내부 작업과는 거리가 멀다. 실제로 여기서 논의되는 것보다 약 2 단계 높은 수준이다.
peterph

OSI 링고에서 여기서 논의 된 계층 은 여전히 ​​dbus 의 계층 보다 낮을 수 있습니다. 나는 둘 다 같은 계층에 있는지 여부에 대해 깊이 생각하지 않았다는 것을 인정합니다.
syntaxerror

답변:


6

리눅스 고유의 답변 :

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 

나는 이것을 할 수있는 휴대용 방법이 의심 스럽다.


2

이 작업을 수행하는 올바른 방법 TM 은 실제로 실행중인 시스템과 커널에 따라 크게 다릅니다. DTrace 는 Solaris, Free / NetBSD 및 Linux에서 작동해야합니다.

특히 리눅스의 경우 ftrace (컴파일 시간에 활성화해야 함) 또는 netlink를 통한 proc 이벤트를 사용할 수 있습니다- 자세한 내용은 문제에 대한 SO 답변 을 참조하십시오 (그리고 점수를 매기십시오 ~ 허용되는 답변에 대한 30 대 0은 웃겨 보입니다.) strace -eexec,fork(불합리한 오버 헤드가 있지만) 가난한 사람의 추적 프로그램을 사용하여 구현할 수 있습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.