Список всех пользователей - людей и количества их процессов

Я пытаюсь перечислить всех реальных пользователей через командную строку наряду со многими их процессами, примером:

root 73
user1 51
user2 68

Я попробовал несколько команд, все же не удался получить вывод, как записано. Эти два - те, я думаю, должно наиболее подходить для списка пользователей только:

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

(не перечисляет корень, так как его PID 0),

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

(требует корня),

Я также знаю, что команда PS используется для списка всех процессов, однако мой вопрос состоит в том, как распечатать определенное количество процессов на пользователя после того, как они печатаются через команду?

Не уверенный, если передача по каналу является решением, wc -l мог бы помочь здесь для подсчета также.Спасибо.

1
задан 19 November 2015 в 01:13

3 ответа

pgrep может распечатать количество процессов для данного пользователя, и xargs uns программа для каждой строки ее входа. Помещенный, что вместе с Вашим Вґawk' команда:

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

я добавляю root вручную к выводу awk. Можно было использовать

if($3>=1000 || $3==0)

в эти awk команда вместо этого.

2
ответ дан 3 December 2019 в 07:00

Используйте в своих интересах/proc файловую систему: Ваша оболочка является ударом, таким образом:

shopt -s extglob
stat -c '%U %u' /proc/+([0-9])/ | awk '$2 >= 1000 {print $1}' | sort | uniq -c
2
ответ дан 3 December 2019 в 07:00

Существует более простой подход, который использует ps форматирование опций и AWK

Мы знаем, что по умолчанию, у пользователей - людей есть UID, который колеблется от 1 000 до 65 533 (UID 65534 nobody пользователь).

Мы также знаем это ps имеет флаг форматирования -o , где мы можем принять решение произвести UID, а также процесс. Формат был бы следующим (обратите внимание, что я показываю здесь только 5 первых строк),

ps -eo uid,cmd | head -n 5                                           
  UID CMD
    0 /sbin/init
    0 [kthreadd]
    0 [ksoftirqd/0]
    0 [kworker/0:0H]

Таким образом мы можем сделать

ps -eo uid,cmd | awk '$1 >= 1000 && $1 < 65534 ' 

AWK помогает нам распечатать все строки, где столбец 1, UID больше или равен 1 000 И меньше чем 635 534.

Демонстрационный вывод от моей системы (где у меня есть только один пользователь):

$ ps -eo uid,cmd | awk '$1 >= 1000 && $1 < 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 $1 >= 1000 && $1 < 635534 
 1000 tail -n 5

Править

Я понял, что OP хотела количество процессов, используемых пользователями - людьми.

Если все, о чем Вы действительно заботитесь, является количеством процессов, которые принадлежат пользователям - людям, вот быстрое решение:

ps --no-headers -eo uid,args --sort=uid | awk '$1 >= 1000 && $1 < 65534 {counter++}; END{print counter" human processes"}'

Что касается моего предыдущего решения, я улучшился AWK команда, которая использует ассоциативные массивы, на основе UID, а также добавила дополнительные флаги к ps команда, чтобы включать имя пользователя и отсортировать вывод по UID.

 ps -eo uid,euser,cmd --sort=uid | awk '$1 >= 1000 && $1 < 65534 { HUMAN++; procTotals[$1]++; if( $1 > UID  ) username[$1]=$2; UID=$1  }  END{ print "Out of "NR" processes, "HUMAN" belong to human users";   for(i=1000;i<=UID;i++ )  print  username[i]":"procTotals[i] }'

Демонстрационный вывод:

xieerqi:$ ps -eo uid,euser,cmd --sort=uid | awk '$1 >= 1000 && $1 < 65534 { HUMAN++; >
Out of 215 processes, 88 belong to human users
xieerqi:84
testuser:4

Для лучшей удобочитаемости вот форматированный код. Обратите внимание, что awk часть могла быть превращена в сценарий с #!/usr/bin/awk -f строка хижины

ps -eo uid,euser,cmd --sort=uid | awk '$1 >= 1000 && $1 < 65534 { 

HUMAN++; procTotals[$1]++; 
if( $1 > UID  ) username[$1]=$2; UID=$1  

}

END{ print "Out of "NR" processes, "HUMAN" belong to human users";   

for(i=1000;i<=UID;i++ )  
    print  username[i]":"procTotals[i] 

}'
0
ответ дан 3 December 2019 в 07:00

Другие вопросы по тегам:

Похожие вопросы: