Страница 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
Ну как успехи?