Como posso pedir ps
para exibir apenas processos do usuário e não threads do kernel?
Veja esta pergunta para ver o que quero dizer ...
Como posso pedir ps
para exibir apenas processos do usuário e não threads do kernel?
Veja esta pergunta para ver o que quero dizer ...
Isso deve fazer (no Linux):
ps --ppid 2 -p 2 --deselect
kthreadd
(PID 2) possui PPID 0 ( no Linux 2.6+ ), mas ps
não permite filtrar o PPID 0; assim, esta solução alternativa.
kthreadd
é sempre o PID 2?kthreadd
e crie aps
chamada de acordo . Qual é a garantia de que essa coisa "sempre" será chamada de "kthreadd"? Uma solução segura seria mais complicada, executeps
normalmente e analise a saída, talvez faça alguns testes.x
bandeira que não funciona com isso.ps au --ppid 2 -p 2 --deselect
funciona bem.Uma maneira de reconhecer os processos do kernel é que eles não usam nenhuma memória do usuário, então o campo vsz é 0. Isso também captura zumbis (graças a Stephane Chazelas por essa observação), que podem ser eliminados com base em seu status.
Para listar apenas os PIDs:
fonte
Na prática, encontrei o seguinte idioma o suficiente:
Ele filtra as linhas que terminam com colchetes, o que pode resultar na omissão de entradas indesejadas, mas é muito improvável. Em troca, é bastante fácil de lembrar e relativamente rápido de digitar.
Alguns processos como o avahi-daemon adicionam informações de nome de processo entre colchetes (o nome do host no caso do avahi-daemon) e serão filtrados por este comando.
fonte
Uma das particularidades desses processos é que eles não são apoiados por um arquivo executável; portanto, você pode fazer ( no zsh ):
Ou com qualquer shell POSIX:
Essa é a verificação de processos cujo
/proc/<pid>/exe
link para um arquivo.Mas isso significa que você precisa ser superusuário para poder verificar o estado do
/proc/<pid>/exe
link simbólico.Editar : como acontece com os processos zumbis (pelo menos), eles satisfazem a mesma condição; portanto, se você não os quiser excluídos, será necessário adicioná-los novamente. Gostar:
Observe que
ps -f
mostra esses nomes de processos entre colchetes não porque são processos do kernel, mas porque eles estão vaziosargv[]
(então o ps mostra o nome do processo em vez deargv[0]
lá). Você pode ter um processo de espaço do usuário com um vazioargv[]
também e pode ter um nome de processo comargv[0]
esse formato,[some-string]
portanto, filtrar aps
saída com base nesses colchetes não é uma opção infalível.fonte
zsh
sintaxe. O segundo é a sintaxe padrão POSIXsh
(eps
andfind
andcut
andpaste
). Claro que/proc
não é especificado pelo POSIX.wc -l
). Bem, eu aceitarei a resposta de Hauke Laging e darei-lhe um voto positivo . ;)Você também pode apenas analisar a
ps
saída e procurar nomes de processos que não estão entre colchetes:fonte
awk -F: '$7 ~ home { print $1 }' /etc/passwd
- mas você ainda terá processos que mencionam esse nome de usuário e deixará o arquivo temporário por aí. Retirei meu voto negativo, mas apenas porque sua terceira solução é razoável.$NF
é a última palavra da linha de comando naps aux
saída. Processos que não são do kernel podem ter[...]
lá. Como eu disse na minha resposta, a[xxx]
notação não é porque eles são processos do kernel, mas porque eles não têm linha de comando (nenhum argumento), o que também é permitido para processos que não são do kernel.Para quem tenta fazer isso no busybox, onde
ps
é bastante simplificado e a saída é diferente, essa variante da grande resposta de Gilles funciona bem:De acordo com a resposta de Gilles, a metodologia aqui é encontrar processos que não usem memória do usuário (`vsz col == 0) e filtrar os processos zumbis (status col não é 'Z').
As colunas de saída podem ser ajustadas facilmente, desde que os números dos campos awk com base em 1 sejam ajustados de acordo. Veja as opções que seu ps tem disponível, colocando um valor falso e ele informará. Por exemplo:
fonte
Se você precisar apenas das contagens ... Eu tinha uma necessidade semelhante de filtrar o kernel versus os processos do usuário, mas eu precisava apenas das respectivas contagens de cada um. Esta foi a minha solução:
Saída de amostra :
Explicação : Estou usando o hack que processos VSZ = 0 podem ser considerados processos do kernel. Portanto
awk
, avalio uma comparação no VSZ (deps -eo vsize
), se é igual a zero. O resultado da comparação será um 0 ou 1. booleano. Eu faço uma matrizp[]
e, ao percorrer a lista de processos, se for um processo do kernel, incrementop[1]++
. Caso contrário, como processo do usuário, eu incrementop[0]++
. Após todo o incremento, rotulo e imprimo os valores (ou seja, contagens) para p [0] ep [1] noEND { }
bloco.fonte
O que você está procurando, meu amigo, não é
ps
, maspstree
.Primeiro, identifique o primeiro processo do kernel. Seu PID é geralmente 1 no sistema sem systemd e 2 com systemd.
Então use este comando:
A resposta selecionada (uma com ✅) está usando outro comando:
O problema com este
ps
comando é que ele inclui apenas filhos diretos, mas nem todos os descendentes. Opstree
comando inclui todos os descendentes. Você pode comparar e contar a saída desses dois comandos (é uma maneira fácil de usar| wc
) para verificar.fonte