3

По сути, я хочу построить график использования памяти с каждым именем пользователя в качестве заголовка с течением времени. Я бы установил этот скрипт как задание cron, чтобы создать график, показывающий использование памяти определенными именами пользователей.

Как я могу отобразить процент использования памяти в зависимости от пользователя?

Ось Y должна быть% MEM, ось X должна быть время / дата

Я пытался сделать это с gnuplot, но не получилось.

Данные, которые я хочу представить на графике:

for USER in $(ps haux | awk '{print $1}' | sort -u); do ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }'; done

Пример вывода:

102 0
avahi 0
colord 0
daemon 0
savvas 16.6
miredo 0
nobody 0
postfix 0
root 1.3
rtkit 0
syslog 0
whoopsie 0

Последний скрипт gnuplot, который я использовал:

set term png small size 800,600
set output "mem-graph.png"

set ylabel "%MEM"
set xlabel "Time"

set xtics nomirror
set ytics nomirror

set xrange [0:*]

set key autotitle columnheader

plot "mem.log" using 2 title columnhead(1) with lines

Сценарий, который я использую для построения графика:

#!/bin/bash
rm mem.log
while true
do
    for USER in $(ps haux | awk '{print $1}' | sort -u); do ps haux | awk -v user=$USER '$1 ~ user { sum += $4} END { print user, sum; }'; done >> mem.log
    gnuplot gnuplot.script
    sleep 10
done

1 ответ1

2

Я экспериментировал немного больше и наконец-то создал то, что более или менее соответствует моим потребностям!

graphmem.sh

#!/bin/bash
cwd="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$cwd"
for iuser in $(ps haxo user | sort -u); do
    [[ $iuser == "root" ]] && continue
    ps haxo user:64,pmem | awk -v tnow="`date -u +'%H:%M:%S'`" -v user="$iuser" -v uid="$((id -u $iuser || echo $iuser) 2>/dev/null)" '$1 ~ user { sum += $2} END { if (sum) print tnow,sum,user,uid; else print tnow,0,user,uid; }'
done | sort -nk +2 >> mem.log
gnuplot "gnuplot.script"
cp mem-graph.png /path/to/www-destination/
echo "Done"

Примечание: [[ $iuser == "root" ]] && continue удаляет "root" информацию о пользователе.

gnuplot.script

reset
set key left top
set xtics nomirror
set ytics nomirror

set term png size 5000,1000

set output "mem-graph.png"

set ylabel "% Memory usage"
set xlabel " "
set auto xy
set xtics out offset 1,0 scale 25,0 rotate by 90
set yrange [0:100]
set xrange [0:*]
set style fill solid 1.0 border -1
set boxwidth 1
set multiplot
set title "Memory usage per user"

plot 'mem.log' using ($0):(($2 > 0.5) ? $2 : 1/0):4:xticlabels(stringcolumn(1)." ".stringcolumn(3)." ".stringcolumn(2)."%") with boxes lc variable notitle, \
    '' using ($0):(($2 > 0.5) ? $2 : 1/0):(sprintf("%.1f%%",$2)) with labels offset 0,1 notitle
unset border
unset multiplot

Добавьте в /etc /crontab

@hourly root /path/to/graphmem.sh

Примечание: вы должны удалять mem.log каждый день вручную, но, по крайней мере, он дает хороший график на 24 часа.

мем-graph.png

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .