Perl – wykresy użycia i temperatury CPU

Program zbiera dane o temperaturze i użyciu procesora. Do magazynowana danych wykorzystana została baza dbf obsługiwana przez moduł DBD::XBase (sterownik DBI dla baz takich jak Clipper, dBase, FoxBase czy Foxpro). Do rysowania wykresów wykorzystany został moduł GD::Graph. Program jest raczej propozycją do dalszego rozwijania np. prze dodanie pomiaru temperatury dysków twardych (np. programem hddtemp) i zwiększenie możliwości generowania wykresów. W planach mam zamiar dorzucić pomiar temperatury w serwerowi przez termometr Dallas'a DS1820 na magistrali 1-wire.
Odczyt temperatury i użycia CPU i zapis do dbf'a.
#!/usr/bin/perl
use DBI;
use XBase;
use Time::localtime;
my $tm = localtime;
my $czas = sprintf("%04d", $tm->year+1900) . sprintf("%02d", $tm->mon+1) .
sprintf("%02d", $tm->mday) . sprintf("%02d", $tm->hour) .
sprintf("%02d", $tm->min) . sprintf("%02d", $tm->sec);
$temper = `cat /proc/acpi/thermal_zone/THRM/temperature | cut -d " " -f 14`;
$cpu = `ps aux | awk 'NR > 0 { s +=\$3 }; END {print s}'| cut -d "." -f 1`;
my $dbh = DBI->connect("DBI:XBase:/root/sbin") or print($DBI::errstr);
my $sth = $dbh->prepare(
"insert into temperatura (TEMPER, CPU, CZAS)
values ('$temper','$cpu','$czas')" ) or print($dbh->errstr());
$sth->execute() or die $sth->errstr();
$dbh->disconnect;
Tworzenie wykresu z danych z ostatnich 4 godzin.
#!/usr/bin/perl
use DBI;
use XBase;
use GD::Graph::lines;
use Time::localtime;
use Time::Local;
my $tm = localtime;
my $TIME = timelocal($tm->sec, $tm->min, $tm->hour, $tm->mday,$tm->mon,
$tm->year+1900);
$TIME = $TIME - 4 * 60 * 60;
my $tm = localtime($TIME);
my $czas = sprintf("%04d", $tm->year+1900) . sprintf("%02d", $tm->mon+1) .
sprintf("%02d", $tm->mday) . sprintf("%02d", $tm->hour) .
sprintf("%02d", $tm->min) . sprintf("%02d", $tm->sec);
my $dbh = DBI->connect("DBI:XBase:/root/sbin") or die $dbh->errstr();
my $sth = $dbh->prepare("select TEMPER, CPU, CZAS from temperatura where CZAS>=?")
or die $dbh->errstr();
$sth->execute($czas);
while (@d = $sth->fetchrow_array) {
push @val1, $d[0];
push @val2, $d[1];
push @row, substr($d[2],8,2) . ":" . substr($d[2],10,2);
}
$dbh->disconnect;
my @data = ([@row],[@val1],[@val2]);
my $my_graph = GD::Graph::lines->new(490,250);
$my_graph->set(
two_axes => 1,
zero_axis => 1,
x_label_skip => 23,
title => 'Temperatura i użycie procesora',
transparent => 0,
);
$my_graph->set_legend( 'lewa strona - temperatura', 'praw strona - cpu' );
my $gd = $my_graph->plot(\@data) or die $my_graph->error;
open(IMG, '>/var/www/htdocs/temperatura.gif') or die $!;
binmode IMG;
print IMG $gd->gif;
close IMG;
Struktura bazy temperatura.dbf
Name Type Width TEMPER Numeric 3 CPU Numeric 3 CZAS Numeric 14
Całość do pobrania w zipie.
temperatura.zip (1.46 KB)
8 maj 2010 | Kategorie: Komputery
Comments
Skomentuj






