Existe uma abordagem mais simples que usa ps
opções de formatação e AWK
Sabemos que, por padrão, os usuários humanos têm um UID que varia de 1.000 a 65533 (o UID 65534 é nobody
user).
Sabemos também que ps
tem o sinalizador de formatação -o
, onde podemos escolher a saída do UID, bem como o processo. O formato seria o seguinte (note que estou mostrando aqui apenas 5 primeiras linhas)
ps -eo uid,cmd | head -n 5
UID CMD
0 /sbin/init
0 [kthreadd]
0 [ksoftirqd/0]
0 [kworker/0:0H]
Assim, podemos fazer
ps -eo uid,cmd | awk ' >= 1000 && < 65534 '
O AWK nos ajuda a imprimir todas as linhas onde a coluna 1, o UID é maior ou igual a 1000 e menor que 635534.
Exemplo de saída do meu sistema (onde tenho apenas um usuário):
$ ps -eo uid,cmd | awk ' >= 1000 && < 635534 ' | tail -n 5
1000 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-session
1000 /usr/lib/firefox/firefox google.com
1000 ps -eo uid,cmd
1000 awk >= 1000 && < 635534
1000 tail -n 5
EDITAR
Percebi que o OP queria o número de processos usados por usuários humanos.
Se tudo o que realmente importa é o número de processos que pertencem a usuários humanos, veja uma solução rápida:
ps --no-headers -eo uid,args --sort=uid | awk ' >= 1000 && < 65534 {counter++}; END{print counter" human processes"}'
Quanto à minha solução anterior, aprimorei o comando AWK
, que usa matrizes associativas, com base no UID, além de adicionar sinalizadores adicionais ao comando ps
para incluir o nome de usuário e classificar a saída por UID.
ps -eo uid,euser,cmd --sort=uid | awk ' >= 1000 && < 65534 { HUMAN++; procTotals[]++; if( > UID ) username[]=; UID= } END{ print "Out of "NR" processes, "HUMAN" belong to human users"; for(i=1000;i<=UID;i++ ) print username[i]":"procTotals[i] }'
Exemplo de saída:
xieerqi:$ ps -eo uid,euser,cmd --sort=uid | awk ' >= 1000 && < 65534 { HUMAN++; >
Out of 215 processes, 88 belong to human users
xieerqi:84
testuser:4
Para melhor legibilidade, aqui está o código formatado. Observe que a parte awk pode ser transformada em um script com a linha #!/usr/bin/awk -f
shebang
ps -eo uid,euser,cmd --sort=uid | awk ' >= 1000 && < 65534 {
HUMAN++; procTotals[]++;
if( > UID ) username[]=; UID=
}
END{ print "Out of "NR" processes, "HUMAN" belong to human users";
for(i=1000;i<=UID;i++ )
print username[i]":"procTotals[i]
}'