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