Listando todos os usuários humanos e o número de seus processos

1

Estou tentando listar todos os usuários reais por meio da linha de comando junto com vários processos deles, por exemplo:

root 73
user1 51
user2 68

Eu tentei vários comandos ainda não consegui obter a saída como está escrito. Estes dois são os que eu acho que devem ser os mais apropriados para listar apenas usuários:

awk -F':' '{ if( >= 1000) print  }' /etc/passwd  

(não lista raiz desde que seu PID é 0)

awk -F':' ' ~ "$" {print }' /etc/shadow 

(requer raiz)

Eu também estou ciente de que o comando ps é usado para listar todos os processos, no entanto, minha pergunta é como imprimir um número específico de processos por usuário depois que eles são impressos via comando?

Não tenho certeza se a tubulação é uma solução, wc -l pode ajudar também na contagem. Obrigado.

    
por box1337 18.11.2015 / 23:08

3 respostas

2

pgrep pode imprimir o número de processos para um determinado usuário e xargs uns um programa para cada linha de entrada. Coloque isso junto com o comando 'hak':

(echo root; awk -F: '{if(>=1000)print }' /etc/passwd) | xargs -i sh -c 'echo "{} $(pgrep -cu {})"'

Estou adicionando root manualmente à saída de awk . Pode-se usar

if(>=1000 || ==0)

no comando awk .

    
por Florian Diesch 18.11.2015 / 23:49
2

Aproveite o sistema de arquivos / proc: Seu shell é bash, então:

shopt -s extglob
stat -c '%U %u' /proc/+([0-9])/ | awk ' >= 1000 {print }' | sort | uniq -c
    
por glenn jackman 19.11.2015 / 00:03
0

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] 

}'
    
por Sergiy Kolodyazhnyy 19.11.2015 / 01:21