O ps pode exibir apenas processos não kernel no Linux?

38

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. ..

    
por Totor 07.06.2013 / 16:06

7 respostas

30

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.

    
por 07.06.2013 / 16:26
8

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}'
    
por 08.06.2013 / 01:49
7

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.

    
por 07.06.2013 / 16:18
7

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.

    
por 22.12.2013 / 18:01
1

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
    
por 02.02.2015 / 15:47
0

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 { } .

    
por 07.12.2017 / 16:36
-1

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!~/^\[.+\]$/'
    
por 07.06.2013 / 21:35