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