Bash скрипт для получения указанного c идентификатора пользователя (ов) и количества процессов - PullRequest
0 голосов
/ 20 февраля 2020

Мне нужен скрипт bash для подсчета процессов пользователей SPECIFI C или всех пользователей. Мы можем ввести 0, 1 или более аргументов. Например,

./myScript.sh root deamon

должно выполняться следующим образом:

root      92
deamon     8
2 users has total processes: 100

Если в качестве параметра не указано ничего, тогда должны быть перечислены все пользователи:

uuidd      1
awkd       2
daemon     1
root     210
kklmn      6
  5 users has total processes: 220

Что я до сих пор есть скрипт для всех пользователей, и он прекрасно работает (с некоторыми предупреждениями). Мне просто нужна часть, где вводятся аргументы (какой-то фильтр результатов). Вот скрипт для всех пользователей:

cntp = 0  #process counter
cntu = 0  #user counter

ps aux |
awk 'NR>1{tot[$1]++; cntp++}
     END{for(id in tot){printf "%s\t%4d\n",id,tot[id]; cntu++} 
     printf "%4d users has total processes:%4d\n", cntu, cntp}'

Ответы [ 2 ]

3 голосов
/ 20 февраля 2020
#!/bin/bash

users=$@
args=()
if [ $# -eq 0 ]; then
  # all processes
  args+=(ax)
else
  # user processes, comma-separated list of users
  args+=(-u${users// /,})
fi

# print the user field without header
args+=(-ouser=)

ps "${args[@]}" | awk '
  { tot[$1]++ }
  END{ for(id in tot){ printf "%s\t%4d\n", id, tot[id]; cntu++ }
  printf "%4d users has total processes:%4d\n", cntu, NR}'

Аргументы ps хранятся в массиве args и содержат список всех процессов с ax или пользовательских процессов в форме -uuser1,user2, а -ouser= содержит только поле пользователя без заголовка.

В скрипте awk я удалил только тест NR>1 и переменную cntp, которую можно заменить на NR.

Возможные вызовы:

./myScript.sh
./myScript.sh root daemon
./myScript.sh root,daemon
1 голос
/ 20 февраля 2020

Кажется, работает следующее:

ps axo user |
awk -v args="$(IFS=,; echo "$*")" '
    BEGIN {
        # split args on comma
        split(args, users, ",");
        # associative array with user as indexes
        for (i in users) {
            enabled[users[i]] = 1
        }
    }
    NR > 1 {
        tot[$1]++;
        cntp++;
    }
    END {
        for(id in tot) {

            # if we passed some arguments
            # and its disabled
            if (length(args) && enabled[id] == 0) {
                continue
            }

            printf "%s\t%4d\n", id, tot[id];
            cntu++;
        } 
        printf "%4d users has total processes:%4d\n", cntu, cntp
    }
'

Проверено в repl .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...