Isso deve ser feito (no Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) tem PPID 0 ( no Linux 2.6 + ) mas ps
não permite filtrar por PPID 0; assim, esta solução alternativa.
Como posso pedir ao ps
para exibir apenas processos do usuário e não encadeamentos do kernel?
Veja esta pergunta para ver o que quero dizer. ..
Uma maneira de reconhecer os processos do kernel é que eles não usam nenhuma memória de usuário, então o campo vsz é 0. Isso também captura zumbis (graças a Stephane Chazelas para esta observação), que pode ser eliminada com base no seu status.
ps axl | awk '$7 != 0 && $10 !~ "Z"'
Para listar apenas os PIDs:
ps -e -o pid= -o state= -o vsize= | awk '$2 != "Z" && $3 != 0 {print $1}'
Uma das particularidades desses processos é que eles não são apoiados por um arquivo executável, então você poderia fazer ( em zsh ):
ps /proc/[0-9]*/exe(^-@:h:t)
Ou com qualquer shell POSIX:
ps -p "$(find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3 | paste -sd , -)"
Essa é a verificação de processos cujo /proc/<pid>/exe
é um link para um arquivo.
Mas isso significa que você precisa ser superusuário para poder verificar o estado do link simbólico /proc/<pid>/exe
.
Editar : Acontece que os processos zumbis (pelo menos) satisfazem a mesma condição, então se você não quer que eles sejam excluídos, você deve adicioná-los novamente. Como:
ps -p "$(
{ find -L /proc/[0-9]*/exe ! -type l | cut -d / -f3
ps -eo pid=,state= | sed -n 's/ Z//p'
} | paste -sd , -)"
Observe que ps -f
mostra esses nomes de processo entre colchetes não porque são processos do kernel, mas porque eles têm um argv[]
vazio (portanto, ps mostra o nome do processo em vez de argv[0]
). Também é possível ter um processo de espaço do usuário com argv[]
vazio e você pode ter um nome de processo com argv[0]
na forma [some-string]
, portanto, filtrar a ps
de saída com base nesses colchetes não é infalível opção.
Na prática, encontrei o seguinte idioma:
ps auxf | grep -v ]$
Filtra linhas que terminam com colchetes, o que pode resultar na omissão de entradas indesejadas, mas é muito improvável. Em troca, é bem fácil de lembrar e relativamente rápido de digitar.
Alguns processos como o avahi-daemon adicionam as informações do nome do processo entre parênteses (o nome do host no caso do avahi-daemon) e serão filtrados por esse comando.
Para quem está tentando isso em busybox, onde ps
é muito simplificado e a saída é diferente, essa variante da ótima resposta de Gilles funciona bem:
ps -o pid,user,comm,vsz,stat | awk '$4 != 0 && $5 !~ "Z"'
De acordo com a resposta de Gilles, a metodologia aqui é encontrar processos que não usam qualquer memória de usuário ('vsz col == 0) e filtrar processos de zumbis (o status col não é' Z ').
As colunas de saída podem ser ajustadas facilmente, desde que os números dos campos awk baseados em 1 sejam ajustados de acordo. Veja as opções que seu ps tem disponíveis colocando um valor falso e ele informará. Por exemplo:
$ ps -o foo
ps: bad -o argument 'foo', supported arguments: user,group,comm,args,pid,ppid,pgid,tty,vsz,stat,rss
Se você precisa apenas das contagens ... Eu tinha uma necessidade semelhante de filtrar processos kernel vs. user, mas eu precisava apenas das respectivas contagens de cada um. Esta foi a minha solução:
ps -eo vsize | awk '{p[$1==0]++} END {printf "%-16s %6d\n%-16s %6d\n%-16s %6d\n", "Kernel processes", p[1], "User processes", p[0], "Total processes", p[0]+p[1]}'
Exemplo de saída :
Kernel processes 353
User processes 52
Total processes 405
Explicação : Estou usando o hack que os processos VSZ = 0 podem ser considerados processos do kernel. Então, com awk
, eu avalio uma comparação no VSZ (de ps -eo vsize
), se é igual a zero. O resultado da comparação será um booleano 0 ou 1. Eu faço uma matriz p[]
, e conforme eu percorro a lista de processos, se é um processo do kernel, eu incremento p[1]++
. Caso contrário, como processo do usuário, eu incremento p[0]++
. Depois de todo o incremento, rotulo e imprimo os valores (ou seja, contagens) para p [0] ep [1] no bloco END { }
.
Você também pode analisar apenas a saída ps
e procurar por nomes de processos que não estejam entre colchetes:
ps aux | awk '$NF!~/^\[.+\]$/'
Tags process ps linux filter linux-kernel