识别内核线程

我想知道如何区分我正在构build的进程扫描程序的用户线程的内核线程。 我很难find这两种types的好定义。

我发现内核线程没有自己的内存,所以/ proc / $ pid / status中没有Vm *值,并且/ proc / $ pid / exe中的统计信息不会返回任何内容。

所以,我想我可以识别内核线程,如果一个进程没有Vm *值和没有inode号码。 我想错了…我的脚本看到php-cgi进程有时被识别为内核进程。

如果发现那些错误识别出来的进程中的大部分是僵尸,那么一秒钟后就会死掉。 所以我执行了一个简单的检查,看看状态是否是“Z”。 如果是这样,请忽略它。 这为我节省了很多误报,但是我仍然收到有关php-cgi内核进程的消息。

任何人都可以告诉我如何以正确的方式区分内核线程和用户线程?

Solutions Collecting From Web of "识别内核线程"

内核线程和用户空间线程之间一些可见的区别:

  • /proc/$pid/cmdline对于内核线程是空的 – 这是pstop用来区分内核线程的方法。

  • /proc/$pid/exe符号链接没有内核线程的目标 – 这是合理的,因为它们在文件系统上没有相应的可执行文件。

    更具体地说, readlink()系统调用返回ENOENT“没有这样的文件或目录” ),尽管链接本身存在,表示这个过程的可执行文件不存在(并且从来没有)。

    因此,检查内核线程的可靠方法应该是调用/proc/$pid/exe上的readlink()并检查其返回码。 如果成功,那么$pid是一个用户进程。 如果ENOENT失败,那么/proc/$pid/exe上的一个额外的stat()应该告诉已经终止的进程的内核线程的情况。

  • /proc/$pid/status缺少大多数内核线程的几个字段 – 更具体地说是与虚拟内存相关的几个字段。

正如你在上面你自己的评论中指出的那样,所有的用户进程都是init进程的后代(pid = 1)。 内核线程不是init进程的后代,因为init是一个用户进程,并且用户进程不能创建内核线程。 因此,为了检查进程p是否是用户进程而不是内核线程,需要对进程图进行操作,并评估是否dom是Dominator运算符。 具体来说在Python中:

 def is_user_process(p): if (p=='1'): print 'User process' else: pstat = open('/proc/%s/stat'%p).read().split() parent = pstat[3] if (parent=='1'): print 'User process' elif (parent=='0'): print 'coreel thread' else: is_user_process(parent) 

这是一个在bash下工作的版本:

 # check if pid is user process and not a kernel thread is_user_process() { if [[ $1 -eq 1 ]]; then return 0 else parent=$(grep -e '^PPid:' /proc/$1/status | cut -c6-) if [[ $parent -eq 1 ]]; then return 0 elif [[ $parent -eq 0 ]]; then return 1 else is_user_process $parent fi fi } 

用它来做

 ~$ is_user_process `pgrep kthreadd` || echo "kthreadd is kernel process" 

至少这对我来说是第一个有用的解决方案,感谢python版本的er0。