3.0 이전 커널에서 커널 스레드 감지

3.0 이전 커널에서 커널 스레드 감지

proc 맨페이지(http://man7.org/linux/man-pages/man5/proc.5.html) 값( ) /proc/<pid>/stat을 보면 어떤 프로세스가 커널 스레드인지 확인할 수 있습니다.flagsPF_KTHREAD

flags %u (%lu before Linux 2.6.22)
     (9) The kernel flags word of the process.  For bit
     meanings, see the PF_* defines in the Linux kernel
     source file include/linux/sched.h.  Details depend
     on the kernel version.

이 프로세스 플래그( PF_KTHREAD)는 커널 버전 2.6.18(RHEL5에서 사용됨)에는 존재하지 않는 것으로 보이며, 이 값은 다른 플래그에서 사용됩니다.

pid가 커널 스레드인지 확인하는 다른 방법이 있습니까?

답변1

경험적으로 다음을 참조하세요.https://stackoverflow.com/questions/12213445/identifying-kernel-threads

ps그리고 top(부터procps-3.28) "명령줄 없음"을 검사로 사용하고 이해하지 못합니다 PF_KTHREAD. 이것이 [``]프로세스 이름에 추가되도록 하는 이유입니다.아니요실제 프로세스 이름의 일부입니다. 명령줄은 프로세스 자체의 제어를 받기 때문에 수정되었을 수 있습니다.

얼마나 멀리 돌아가야 하는지에 따라 다릅니다(2.4? 2.2?). 일부 시스템을 빠르게 검색하면 명확한 공통 서명이 표시되지 않습니다(필드 9 /proc/PID/stat).

2.6.x 이후 버전에서는 부모의 PID가 0인 것으로 추측할 수 있습니다. [kthreadd]일반적으로 PID는 2이고 모든 스레드는 해당 자식이 됩니다( initPPID=0일 수도 있음). 아니면 (초기 2.6.x?) [kthread]PID 2가 아니라 모든 스레드가 아닌 대부분의 스레드일 수도 있습니다.

또 다른 방법은 커널 스레드에 대해 비어 있는 사용자 공간 메모리 맵을 확인하는 것입니다 /proc/PID/maps. 따라서 프로세스 플래그(in /proc/PID/stat)가 비어 있지 않은 &(PF_EXITING)/proc/PID/maps비어 있는 것이 좋은 지표입니다. 크기가 0으로 잘못 보고되므로 실제로 읽어야 maps하며 stat()권한도 받아야 합니다. 그렇지 않으면 오류 없이 비어 있는 것으로 표시될 수 있습니다.

for pp in /proc/[0-9]*; do 
  if [ -z "$(< $pp/maps)" ]; then echo ${pp##/proc/}; fi; 
done 

cmdline비슷한 표현식을 추가하여 비어 있는지 확인할 수도 있습니다 .

답변2

3.8 시리즈 커널의 커널 스레드 항목을 보면 /proc분명히 링크가 exe비어 있고 statm0으로 채워져 있으며 status모든 Vm*항목이 누락되고 maps비어 있습니다.

아마도 이 중 일부는 문제의 이전 커널에 적용될 수 있습니다.

관련 정보