나는 때때로 죽은 프로세스를 생성하는 대규모 응용 프로그램(C++로 작성)을 가지고 있습니다. 나는 응용 프로그램이 내부적으로 많은 Linux 명령을 사용한다는 것을 알고 있습니다. 존재하지 않는 sh 프로세스에서 어떤 Linux 명령을 호출했는지 알아야 합니다. 찾을 수 있나요? 또는 내 애플리케이션이 Linux 명령을 호출할 때 Linux를 설정하고 일종의 로그를 얻을 수 있습니까?
감사해요.
루크
답변1
~에서위키피디아:
데드 프로세스는 실행이 완료되었지만 여전히 프로세스 테이블에 항목이 있는 프로세스입니다. 이 항목은 (현재 좀비) 프로세스를 시작한 프로세스가 종료 상태를 읽을 수 있도록 허용하는 데 여전히 필요합니다.
C++ 코드가 호출을 수행하고 있습니까 wait()
? wait()
만료된 프로세스를 호출하여 종료 상태를 얻은 경우 해당 프로세스는 사라져야 합니다.
답변2
popen
이 대규모 애플리케이션은 유사한 라이브러리 기능을 사용하여 셸을 통해 외부 명령을 실행합니다. 애플리케이션이 호출하지 않기 때문에 중간 쉘은 좀비("죽은 프로세스")로 남아 있습니다.wait
그 아이들을 "수확"합니다. 좀비 프로세스는 완전히 무해합니다(B 영화에서 무엇을 믿더라도). 좀비 프로세스가 소비하는 유일한 리소스는 프로세스 테이블의 항목입니다.
다음을 실행하여 애플리케이션에서 실행된 명령을 추적할 수 있습니다.
strace -f -s99999 -v -eexecve -o big-application.strace ./big-application
이로 인해 프로그램 속도가 약간 느려질 수 있습니다. 프로세스 수명 동안 추적을 켜거나 끌 수 있습니다. 추적을 시작하려면 다음을 실행하세요.
strace -f -s99999 -v -eexecve -o big-application.strace -p 12345
여기서 12345는 추적하려는 프로세스 ID입니다. 추적을 중지하려면 strace
프로세스를 종료합니다 (예: Ctrl+ 누르기).C