Страница 1 из 2

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

Добавлено: 2008-06-06 15:04:36
serge
Нужно распарсить вывод след. команды:

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

# 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

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

Добавлено: 2008-06-06 15:07:06
Alex Keda
тебе одной строкой надо?
сделай в скрипте - дёрни в переменные нужные значиения и их сложи

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

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

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

Добавлено: 2008-06-06 16:26:28
serge
Вобщем через скрипт сделал.

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

# 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.

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

Добавлено: 2008-06-06 17:07:15
zg
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

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

Добавлено: 2008-06-07 2:44:12
serge
to zg:
Спс, на будущее учту.
=====

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

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

Добавлено: 2008-06-07 8:45:46
Alex Keda
а гарфики - для php есть тулзины...
название не помню =(
=======
поделись скриптом. инетерсно - я с rrd не ковырялся...

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

Добавлено: 2008-06-07 8:49:18
Alex Keda
посмотрел скрипты.
можно выдернуть список юзеров из /etc/passwd - uглян уть кого идентификатор больше 999 и по ним цикл забульбенить...
будет нагрузка по всем юзерам.
=========
скрипты сам с нуля рисовал?

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

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

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

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

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

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

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

Добавлено: 2008-06-07 9:20:19
serge
Туть терь проперло и еще хочу по трафику статистику прикрутить попробовать))) Нада разобратся как она валится в БД и завернуть в rrd.

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

Добавлено: 2008-06-07 9:23:25
Alex Keda
кстати - базы динамически создавать надо.
я в скриптах создания не нашёл.
т.е. при запуске тыкаемся по всем юзерам и проверяем есть ли для них база. если нет - создавать

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

Добавлено: 2008-06-07 9:30:40
serge
Это да. Но тут думаю в кроне раз в час или еще реже такой скрипт поставить. А в парсере и построителе графиков проверку на наличие БД делать, если нет, то этого пользователя пока пропускать.
Хотя в 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
Че тут че в доке смотрите... долго объяснять :)
З.Ы. Тут в итоге можно будет хорошую статью написать, имхо.

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

Добавлено: 2008-06-07 9:33:01
Alex Keda
в ДА просто совсем - там любые скрипты положенные в соответствующую директорию будут выполнены от рута.
поэтому мона загибать как хочешь.

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

Добавлено: 2008-06-07 9:36:27
serge
Ну вот и замечательно... значит нужно писать для разных случаев. Пока предварительно под DA, ISPManager и в случае если ничего не стоит.

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

Добавлено: 2008-06-07 11:38:48
Alex Keda

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

#!/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 посмотреть в скриптах рута

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

Добавлено: 2008-06-07 12:02:45
serge
А графики??? Или еще какой-нить результат работы есть?

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

Добавлено: 2008-06-07 12:20:08
Alex Keda
графики - отдельно.
это тока складывать статстику в базу.
==========
сижу думаю - может их всех в один график собрать? много правда - 100 человек, но всё же

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

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

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

Добавлено: 2008-06-07 12:28:16
Alex Keda
тоже можно.
список и сортировать по полю...
но тут опять теряем генерацию на лету по запросу и возвращается в крон...

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

Добавлено: 2008-06-07 12:33:27
serge
Почему теряем??? По запросу генерить индексную страницу, затем опять же по запросу по нужным логинам :?

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

Добавлено: 2008-06-07 13:22:08
Alex Keda
статистику как получать для индексной?

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

Добавлено: 2008-06-07 13:30:11
serge
А вот хз... :?
Думать нада.

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

Добавлено: 2008-06-07 14:18:40
serge
Ну как успехи?