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
status
Vm*
maps
おそらく、これらのいくつかは問題の古いカーネルに適用されるかもしれません。