nixp.ru v3.0

24 мая 2017,
среда,
22:40:10 MSK

DevOps с компанией «Флант»
Аватар пользователя DimkaS
DimkaS написал 17 ноября 2007 года в 23:59 (824 просмотра) Ведет себя как мужчина; открыл 84 темы в форуме, оставил 922 комментария на сайте.

Экспериментирую с gnuplot для отображения разной информации о машине. Решил попробовать наблюдать за напряжением в сети. Написал вот такой скрипт:

#!/bin/sh
LOGFILE=voltage.log
IMGFILE=/home/ftp/pub/voltage.png
while [ 1 ]
do
#read new voltage
date +%H:%M|head -c 5 >> $LOGFILE
upsc ippon600@localhost|grep input.voltage|tail -c 7 >> $LOGFILE
#recreate image
gnuplot <<END
set terminal png size 800,600
set output "$IMGFILE"
set xdata time
set timefmt "%H:%M"
set grid
set title "UPS Input Voltage"
set ylabel "Voltage (V)"
set xlabel "Time"
set time
plot [*:*][0:*] "$LOGFILE" using 1:2 with linespoints title "input"
END
sleep 60
done

Не нравится, что время на графике отображается как ММ:СС если час одинаковый для всех точек. И это при том, что формат указан как ЧЧ:ММ. Как можно исправить? Вот картинка за короткий промежуток: http://dimkas.homelinux.org/voltage1.png, а вот что собралось на данный момент: http://dimkas.homelinux.org/voltage.png

Ну и по самому скрипту… Сдаётся мне, что вместо всех этих head и tail можно использовать что-то другое. Только я не знаю, что… upsc возвращает такие строки:

dimka@box:~$ upsc ippon600@localhost
battery.charge: 100.0
battery.voltage: 13.6
driver.name: ippon
driver.parameter.port: /dev/ttyS0
driver.version: 2.0.4
driver.version.internal: 0.02
input.frequency: 49.9
input.voltage: 206.0
output.voltage: 206.0
ups.load: 009
ups.mfr: Ippon
ups.model: universal driver
ups.status: OL
ups.temperature:

Как можно покрасивее вытащить значения для input.voltage и output.voltage?

+++

Только что обнаружил, что при переходе от 23:59 к 00:00 появляется очень интересный глюк. Видимо, надо добавить еще и дату, чтоб построение шло нормально..

DimkaS

Вот, что мне было нужно:

set xdata time
set timefmt "%Y.%m.%d/%H:%M"
set format x "%H:%M"

Теперь проблем быть не должно. Скоро проверю.

Остался вопрос о красивом извлечении нужного параметра из строки разделённой пробелами. Подскажете — буду рад, а нет — сам нагуглю :)

Genie
Остался вопрос о красивом извлечении нужного параметра из строки разделённой пробелами. Подскажете — буду рад, а нет — сам нагуглю :)



$d=`date +%H:%M`
$iv=`upsc ippon600@localhost | awk '/input.voltage/{print $2}'`
echo $d $iv >> $LOGFILE
Genie
Написал вот такой скрипт:

#!/bin/sh
LOGFILE=voltage.log
IMGFILE=/home/ftp/pub/voltage.png
while [ 1 ]
do
...

а не лучше ли занести содержимое цикла в отдельный скрипт и настроить cron-task для генерации картинки?

DimkaS

Genie, спасибо! Про awk как раз этой ночью в LinuxFormat читал. Скрипт перенесу в крон после того, как выбью из него всё, что мне нужно =)

DimkaS

Еще вопрос вылез. Есть вот эти две строки:

input.voltage: 206.0
output.voltage: 206.0

Можно ли как-то оба числа сразу вытащить и через пробел в файл дописать? Или надо два раза выполнять команду с разными параметрами для awk?

DimkaS

Вот конечный (надеюсь) результат:

#!/bin/sh
LOGFILE=voltage1.log
IMGFILE=/home/ftp/pub/voltage1.png
TMPFILE=voltage1.log.tmp
#append new values to log
d=`date +%Y/%m/%d-%H:%M`
v=`upsc ippon600@localhost |grep .voltage|tail -n2| awk '{print $2}'`
echo $d $v >> $LOGFILE
#cut old values
tail -n 288 $LOGFILE > $TMPFILE
mv $TMPFILE  $LOGFILE
#recreate image
gnuplot <<END
set terminal png size 800,600
set output "$IMGFILE"
set xdata time
set timefmt "%Y/%m/%d-%H:%M"
set grid
set title "UPS Input Voltage"
set ylabel "Voltage (V)"
set xlabel "Time"
set format x "%H:%M"
set time
f(x)=220
plot [*:*][0:*] "$LOGFILE" using 1:2 with lines title "UPS input", \
f(x) with lines title "220 V", \
"$LOGFILE" using 1:3 with lines title "UPS output"
END
exit 0