Heuristicamente, consulte o link
ps
e top
(de procps-3.28 ) usam "nenhuma linha de comando" como verificação e não têm conhecimento de PF_KTHREAD
. É isso que os aciona para adicionar ['']
ao nome do processo, não é parte do nome do processo real. Como a linha de comando está sob controle do processo em si, é possível que ele tenha sido modificado.
Depende de quão longe você está (2.4? 2.2?). Um rápido remexer em alguns sistemas indica que não há bandeira comum evidente (campo 9 de /proc/PID/stat
)
No final de 2.6.x você pode adivinhar principalmente pelo PID pai sendo 0 para [kthreadd]
, que frequentemente terá PID 2, e todos os segmentos serão seus filhos ( init
pode ter PPID = 0 também). Ou possivelmente (início 2.6.x?) A [kthread]
, mas não PID 2, mas pode ser apenas o pai da maioria, não de todos os threads.
Outra maneira é inspecionar /proc/PID/maps
(mapa de memória do espaço do usuário), pois um encadeamento do kernel estará vazio - assim, o sinalizador de processo (em /proc/PID/stat
) não será &(PF_EXITING)
, /proc/PID/maps
sendo vazio é um bom indicador. Note que você deve realmente ler maps
, não apenas stat()
, já que o tamanho é incorreto como 0; e você também deve ter permissão, se não aparecer, pode parecer vazio sem causar um erro.
for pp in /proc/[0-9]*; do
if [ -z "$(< $pp/maps)" ]; then echo ${pp##/proc/}; fi;
done
Você pode adicionar uma expressão semelhante para verificar se cmdline
também está vazio.