Я пытаюсь перечислить всех реальных пользователей через командную строку наряду со многими их процессами, примером:
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
мог бы помочь здесь для подсчета также.Спасибо.
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
команда вместо этого.
Используйте в своих интересах/proc файловую систему: Ваша оболочка является ударом, таким образом:
shopt -s extglob
stat -c '%U %u' /proc/+([0-9])/ | awk '$2 >= 1000 {print $1}' | sort | uniq -c
Существует более простой подход, который использует 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]
}'