Perl – wykresy użycia i temperatury CPU

Temperatura i użycie 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)

Olek Kwaśniewski

Comments

Skomentuj




51 SQL queries done. Page generation took 0,371 seconds.