proc 맨페이지(http://man7.org/linux/man-pages/man5/proc.5.html) 값( ) /proc/<pid>/stat
을 보면 어떤 프로세스가 커널 스레드인지 확인할 수 있습니다.flags
PF_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이고 모든 스레드는 해당 자식이 됩니다( init
PPID=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
비어 있고 statm
0으로 채워져 있으며 status
모든 Vm*
항목이 누락되고 maps
비어 있습니다.
아마도 이 중 일부는 문제의 이전 커널에 적용될 수 있습니다.