graphmem.sh

graphmem.sh

基本上,我想随着时间的推移绘制以每个用户名为标题的内存使用情况图表。我会将该脚本设置为 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

我进行了更多的实验,最终创造出了一些或多或少符合我需要的东西!

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脚本

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 小时的清晰图表。

内存图.png

相关内容