Распарсить вывод ps -aux

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-06 15:04:36

Нужно распарсить вывод след. команды:

Код: Выделить всё

# ps -aux | grep php-cgi | awk '{print $1, $3, $4}'
Требуется сложить все значения 3 и 4 колонки с одинаковым именем пользователя в 1 колонке. Смысл в том что нужно получить суммрную загрузку проуа и памяти для каждого пользователя.
Пробовал вот так, но получается немного не то:

Код: Выделить всё

hosting# ps -aux | grep php-cgi | awk '{print $1, $3, $4}' | grep -v root | awk '{sum[$1] += $2}; {print $1, sum[$1]}'
lissyara 0,9
lissyara 1,8
lissyara 2,7
lissyara 3,5
lissyara 4,1
lissyara 4,5
lissyara 4,8
lissyara 5
lissyara 5,2
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
lissyara 5,4
saratovsch 0
saratovsch 0
saratovsch 0
lissyara 5,4
lissyara 5,4
bezet 0
bezet 0
bezet 0

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-06 15:07:06

тебе одной строкой надо?
сделай в скрипте - дёрни в переменные нужные значиения и их сложи
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-06 15:13:47

Ех... хочеться чтоб в одной команде было. Тут чувствую что где-то рядом истина. Вот суммировать получается, но мне не нужно промежуточных результатов, хочется сразу ИТОГО.

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-06 16:26:28

Вобщем через скрипт сделал.

Код: Выделить всё

# vi resource.usage.sh
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/root/bin

allpslog=/tmp/allps.log

ps -aux | grep php-cgi | awk '{print $1, $3, $4}' | grep -v root | sort > ${allpslog}

cat ${allpslog} | awk '{print $1}' | uniq | while read username
do
        grep ${username} ${allpslog} | awk '{proc += $2; mem += $3}; {print $1, proc, mem}' | tail -n1
done
Вечером допишу скадывание в БД данных и потом нужно веб-морду для просмотра графиков и отправку суточного отчета на e-mail.

zg
полковник
Сообщения: 5845
Зарегистрирован: 2007-12-07 13:51:33
Откуда: Верх-Нейвинск

Re: Распарсить вывод ps -aux

Непрочитанное сообщение zg » 2008-06-06 17:07:15

serge писал(а):awk '{sum[$1] += $2}; {print $1, sum[$1]}'
хм.. странная конструкция..
serge писал(а):awk '{proc += $2; mem += $3}; {print $1, proc, mem}' | tail -n1
у скриптв awk есть блоки - начало, середина, конец, соотвественно 'BEGIN{команды до обработки}{команды обработки}END{команды после обработки}', например

Код: Выделить всё

 # :echo -e "3\n5\n6" | awk 'BEGIN{print "Суммаризация\n---------"}{print "\t"$1; sum+=$1}END{print "---------\nИтого: "sum}'
Суммаризация
---------
        3
        5
        6
---------
Итого: 14

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 2:44:12

to zg:
Спс, на будущее учту.
=====

Вобщем ночь не зря прошла. Оценивайте - http://hosting.lissyara.su/lissyara-rrd.html
Графики использования ресурсов хостинга сайтами владелец которых lissyara. Оценивается с помощью снятия статистики (ps) с процессов php-cgi и обработки ее с помощью rrdtools. Статистика ежеминутная, графики перестраиваются каждые 5 мин.
Терь задача сделать такую статистику для всего хостинга. Но там уже намного проще.
З.Ы. Пока дошел до rrdtools реальзовал снитие статистики и складывание ее в MySQL. А вот када думал как графики рисовать, то на rrdtools и натолкнулся. Правда в MySQL варианте снимается по всем пользователям статистика, а в rrdtools варианте пока только для lissyara (как наиболе нагруженного).

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 8:45:46

а гарфики - для php есть тулзины...
название не помню =(
=======
поделись скриптом. инетерсно - я с rrd не ковырялся...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 8:49:18

посмотрел скрипты.
можно выдернуть список юзеров из /etc/passwd - uглян уть кого идентификатор больше 999 и по ним цикл забульбенить...
будет нагрузка по всем юзерам.
=========
скрипты сам с нуля рисовал?
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 9:00:04

Сам. Забубенил по неопытности аж 2 варианта. Сперва думал в mysql статистику класть, а потом графики делать, но rrdtools оказался интересней намного. Вот сразу в нем и решил делать, но с mysql тоже есть, токо без графиков Пользовался вот этой статьей - http://www.perldoc.ru/cgi-bin/shell?SID ... =202&aID=5

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 9:02:41

lissyara писал(а):а гарфики - для php есть тулзины...
название не помню =(
=======
поделись скриптом. инетерсно - я с rrd не ковырялся...
Для www можно применять rrdcgi, но у нас чето cgi не очень настроено, поэтому отложит тестирование на попозже ))
==
Скрипты бери, если нада, но еще сыроватые они, однозначно буду доделывать, т.к. часто это стало требоватся на хостингах.
З.Ы. Как сделаю по всем юзерам хочу у дениса попробовать, мона?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 9:17:05

serge писал(а):
lissyara писал(а):а гарфики - для php есть тулзины...
название не помню =(
=======
поделись скриптом. инетерсно - я с rrd не ковырялся...
Для www можно применять rrdcgi, но у нас чето cgi не очень настроено, поэтому отложит тестирование на попозже ))
==
Скрипты бери, если нада, но еще сыроватые они, однозначно буду доделывать, т.к. часто это стало требоватся на хостингах.
З.Ы. Как сделаю по всем юзерам хочу у дениса попробовать, мона?
попробуй. я собсно с этой же целью и инетерсовался =)))
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 9:20:19

Туть терь проперло и еще хочу по трафику статистику прикрутить попробовать))) Нада разобратся как она валится в БД и завернуть в rrd.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 9:23:25

кстати - базы динамически создавать надо.
я в скриптах создания не нашёл.
т.е. при запуске тыкаемся по всем юзерам и проверяем есть ли для них база. если нет - создавать
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 9:30:40

Это да. Но тут думаю в кроне раз в час или еще реже такой скрипт поставить. А в парсере и построителе графиков проверку на наличие БД делать, если нет, то этого пользователя пока пропускать.
Хотя в ISPManager и думаю DA при создании пользователя можно rrd базу создавать сразу же. Создается вот такой командой:

Код: Выделить всё

rrdtool create /home/serge/rrdtool/lissyara.rrd --step 60 \
DS:cpu:GAUGE:600:0:100					\
DS:mem:GAUGE:600:0:100					\
DS:count:GAUGE:600:0:U					\
RRA:AVERAGE:0.5:1:483840				 \
RRA:MIN:0.5:1440:1					 	\
RRA:MAX:0.5:1440:1
Че тут че в доке смотрите... долго объяснять :)
З.Ы. Тут в итоге можно будет хорошую статью написать, имхо.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 9:33:01

в ДА просто совсем - там любые скрипты положенные в соответствующую директорию будут выполнены от рута.
поэтому мона загибать как хочешь.
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 9:36:27

Ну вот и замечательно... значит нужно писать для разных случаев. Пока предварительно под DA, ISPManager и в случае если ничего не стоит.

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 11:38:48

Код: Выделить всё

#!/bin/sh

# tmp
#alias tail /usr/bin/tail

# files path
passwd_file="/etc/passwd"       # users
pslog="/tmp/resusage_rrd.log"   # usage log
bases_preffix="/var/db/da2rrd"

# other
time_step="300"                 # seconds between update

# programm path
rrdtool="/usr/local/bin/rrdtool"

# go!
mkdir -p $bases_preffix
chmod 750 $bases_preffix

# get statics
ps -axo user,%cpu,%mem,comm | awk '{print $1, $2, $3}' > $pslog


# get users with id > 999
cat $passwd_file | grep -v ^\# |
{
while read stroka
do
        # get username
        username="`echo $stroka | awk -F ':' '{print $1}'`"
        uid="`echo $stroka | awk -F ':' '{print $3}'`"
        # real users
        if [ $uid -ge 1000 ]
        then
                #echo $username
                # test - exist or not rrd base
                if [ ! -f $bases_preffix/$username.rrd ]
                then
                        #echo $username
                        # create rrd database
                        $rrdtool create $bases_preffix/$username.rrd \
                        --step $time_step                       \
                        DS:cpu:GAUGE:600:0:100                  \
                        DS:mem:GAUGE:600:0:100                  \
                        DS:count:GAUGE:600:0:U                  \
                        RRA:AVERAGE:0.5:1:483840                \
                        RRA:MIN:0.5:1440:1                      \
                        RRA:MAX:0.5:1440:1
                fi
                # get statistics
                cpu=`grep "^$username " $pslog | awk '{cpu += $2; mem += $3}; {print $1, cpu, mem}' | tail -n1 | awk '{print $2}' | sed s/,/./`
                mem=`grep "^$username " $pslog | awk '{cpu += $2; mem += $3}; {print $1, cpu, mem}' | tail -n1 | awk '{print $3}'| sed s/,/./`
                count=`grep "^$username " $pslog | wc -l | awk '{print $1}'`
                # users without runnings processes
                if [ $count -eq 0 ]
                then
                        # counters = 0
                        cpu="0"
                        mem="0"
                fi
                #echo $username:$cpu:$mem:$count
                # update user db
                $rrdtool update $bases_preffix/$username.rrd N:$cpu:$mem:$count

        fi


done
}


такая вот хреновина получилась.
мона на serv посмотреть в скриптах рута
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 12:02:45

А графики??? Или еще какой-нить результат работы есть?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 12:20:08

графики - отдельно.
это тока складывать статстику в базу.
==========
сижу думаю - может их всех в один график собрать? много правда - 100 человек, но всё же
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 12:26:35

В один, имхо, неудобно. Я б предпочел индексную страницу со всеми логинами с возможностью перейти на нужный.
+ Хотелось бы чтоб индексная страница формировалась из логинов динамически по убывающей нагрузки на хостинг. Типа top'a своеобразного. Как тебе такой вариант?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 12:28:16

тоже можно.
список и сортировать по полю...
но тут опять теряем генерацию на лету по запросу и возвращается в крон...
Убей их всех! Бог потом рассортирует...

Аватара пользователя
serge
майор
Сообщения: 2133
Зарегистрирован: 2006-07-30 15:34:14
Откуда: Саратов
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение serge » 2008-06-07 12:33:27

Почему теряем??? По запросу генерить индексную страницу, затем опять же по запросу по нужным логинам :?

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35411
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Распарсить вывод ps -aux

Непрочитанное сообщение Alex Keda » 2008-06-07 13:22:08

статистику как получать для индексной?
Убей их всех! Бог потом рассортирует...