문제

Linux에서 C를 사용하여 프로세스 상태 (즉, 좀비 인 경우)에 대한 정보를 어떻게 얻을 수 있습니까?

지금까지 답을 읽은 후에는 내 질문을 다소 좁히고 싶습니다. 순수한 C 솔루션을 선호합니다. PS 소스 (읽기 /Proc /)를 읽은 후에는 더 나은 방법이 있어야한다고 생각하고 여기에 물었습니다 :)

도움이 되었습니까?

해결책

일반적인 C 표준 라이브러리 호출을 통해 / proc / "psuedo-filesystem"과 상호 작용하는 것에 대해 배우고 싶을 것입니다. 시작하는 데 필요한 문서는 Linux 배포판에 포함되어 있으며 간단한 Google 검색입니다.

(이제 당신은 무엇을 찾아야하는지 알았습니다. 나는 그것이 일반적으로 대부분의 도전이라는 것을 알고 있습니다!)

요컨대, 실행중인 Linux 시스템의 / Proc / Directory 내 디렉토리 및 파일은 (당연히) 프로세스를 포함하는 실행중인 커널의 상태를 반영합니다. 그러나 청구하기 전에 정보를 명심해야합니다.

좀비 프로세스는 고아 과정과 동일하지 않습니다. 고아 프로세스는 프로세스의 부모가 잘못 종료 된 후 대기 상태에서 실행되는 프로세스입니다. 좀비 프로세스는 제대로 종료되어 모든 자원을 공개했지만 프로세스 테이블의 장소를 유지하는 프로세스입니다.

이것은 일반적으로 프로그램에 의해 프로세스를 시작할 때 발생합니다. 알다시피, 커널은 학부모 프로그램이 하위 프로세스의 반환 상태를 올바르게 가져올 때까지 프로세스 테이블에서 완성 된 하위 프로세스의 항목을 제거하지 않습니다. 그것은 의미가 있습니다. 부모 프로그램이 하위 프로세스가 부적절하게 빠져 나왔는지 어떻게 알 수 있습니까?

따라서 모든 하위 프로세스는 기술적으로 매우 짧은 시간 동안 좀비입니다. 본질적으로 프로그램에 참여하는 것은 나쁜 상태가 아닙니다.

실제로, "좀비"는 때때로 의도적으로 만들어집니다. 예를 들어, 때로는 좀비 항목이 프로그램에 의해 잠시 동안 제자리에 남아 있으므로 추가 출시 프로세스가 이전에 출시 된 (및 현재 좀비) 프로세스와 동일한 PID를 얻지 못하도록합니다.

다시 말해, 불필요하게 좀비 프로세스를 실행하면 산란 프로그램에 심각한 문제가 발생할 수 있습니다. 그러나 프로세스가 30 분 이상 동안 좀비라면 아마도 버그의 징후 일 것입니다.

편집 : 질문이 변경되었습니다! 아니요, PS가 수행하는 방식보다 더 간단한 방법이 없습니다. 만약 그렇다면 오래 전에 PS에 통합되었을 것입니다. /Proc 파일은 커널 상태에 대한 정보의 모든 소스입니다. :)

다른 팁

나는 두 가지 방법 만 알고 있습니다.

  • 의 구문 분석 출력 ps 명령
  • /proc /pid에서 파일 읽기, 여기서 PID는 프로세스 식별자입니다. ps 내부적으로)

당신은 당신의 컴퓨터에서 프로세스를 실행하고 싶고 사용합니다.

$ ps aux

추신 활성 프로세스 선택에 대한 정보를 표시합니다. 선택 및 표시된 정보의 반복적 인 업데이트를 원한다면 사용하십시오. 맨 위 대신에.

설립하다 여기:

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

이것은 C를 사용하여 쉽게 구문 분석 할 수 있습니다.

의사 파일 시스템 /Proc은 커널 내부 데이터 구조를 설명하고 있으며 일부 값을 직접 변경할 수있는 기회를 제공합니다. 특정 프로세스의 상태를 얻는 것은 I/OC 기능으로 쉽게 구현할 수 있습니다. 구문 분석에 적합한 파일은 다음과 같습니다. /proc/{pid}/status

아래 명령은 좀비 상태에서 프로세스를 얻는 데 사용될 수 있습니다.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top