Cyber Asylum
Monitorovací PHP skript s výstupom pre dzen2
Blog - Open Source
Napísal Jaroslav Petráš   
Pondelok, 20 Jún 2011 15:11
Nedávno som spomínal že som si napísal ZSH skript pre monitorovanie systému s výstupom pre dzen2. Skript som používal k úplnej spokojnosti po dobu troch mesiacov až do včera. Pomocou htop som zbežne pozeral ktorý proces má koľko pamäti alokovanej. Ostal som dosť zarazený keď som uvidel ako má môj ZSH skript nazhromaždených niečo okolo 300MB. Po chvíľke neúspešného pátranie prečo je tomu tak som sa rozhodol že skript ešte posledný-krát prepíšem do interpretovaného jazyka. Posledný-krát pred prepisom do jazyka C. Tento pokus však vyšiel a nový skript teraz plní svoju funkciu nad moje očakávania.


Vzlad a zobrazované informácie ostali zachované.
sysinfo-dzen2-php

A ako to vyzerá s konzumáciou sys. prostriedkov teraz?
 PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND    
 2240 asfethan  25   0  101m 8408 5196 S    0  0.2   4:54.22 /usr/bin/php sysinfo-dzen2-php

Skript od svojho spustenia trvalo okupuje niečo málo cez 8MB pamäti. Taktiež pozorujem menšiu spotrebu procesorového času a promptnejšiu odozvu ako mala jeho ZSH verzia. Som teda zvedavý čo ukáže čas a či je to finálne riešenie.


Pre spustenie a prevádzku je nutné mať nainštalovaný balík php-cli (platí pre Debian GNU/Linux OS)
#! /usr/bin/php
<?php
 
    /*
     *
     *    YOU CAN IGNORE "DO NOT TOUCH THIS" COMMENTS
     *    IF YOU REALLY KNOW WHAT ARE YOU DOING
     *
     */
 
    // EDIT COLORS AND IMAGES PATH
    define("CLR_DEF", "#85a229");
    define("CLR_MED", "#b9a229");
    define("CLR_HIG", "#b95929");
    define("IMG_DIR", "/home/asfethan/.local/share/dzen2/images");
 
    // HEX VALUE OF REGISTER WHEN VOLUME IS AT 0%
    define("VOL_MIN", 0x1f1f);
 
    // DEFINE "MUTED" VALUE WHICH IS ADDITION OF CURRENT VOLUME LEVEL
    define("VOL_MUT", 0x8000);
 
    // EDIT OR ADD PATTERNS FOR PARSING DEFINED FILES
    $a__itm = array
                (
                    "memt"    => array
                            (
                                "pth"    => "/proc/meminfo",
                                "pat"    => "MemTotal:[ ]+([0-9]+)"
                            ),
                    "memf"    => array
                            (
                                "pth"    => "/proc/meminfo",
                                "pat"    => "MemFree:[ ]+([0-9]+)"
                            ),
                    "memb"    => array
                            (
                                "pth"    => "/proc/meminfo",
                                "pat"    => "Buffers:[ ]+([0-9]+)"
                            ),
                    "memc"    => array
                            (
                                "pth"    => "/proc/meminfo",
                                "pat"    => "Cached:[ ]+([0-9]+)"
                            ),
                    "vol"    => array
                            (
                                "pth"    => "/proc/asound/card0/codec97#0/ac97#0-0+regs",
                                "pat"    => "0:02 = ([a-f0-9]+)"
                            ),
                    "eth0"    => array
                            (
                                "pth"    => "/proc/net/dev",
                                "pat"    => "^[ ]+eth0:([0-9 ]+)"
                            ),
                    "tp1"    => array
                            (
                                "pth"    => "/sys/bus/platform/devices/it87.552/temp1_input",
                                "pat"    => "^([0-9]+)"
                            ),
                    "tp2"    => array
                            (
                                "pth"    => "/sys/bus/platform/devices/it87.552/temp2_input",
                                "pat"    => "^([0-9]+)"
                            ),
                    "tp3"    => array
                            (
                                "pth"    => "/sys/bus/platform/devices/it87.552/temp3_input",
                                "pat"    => "^([0-9]+)"
                            )
                );
 
 
    // DO NOT TOUCH THIS
    function get_val($a__in)    {
 
        $b__continue = TRUE;
        $m__out = NULL;
        $s__subj = NULL;
        $a__mat = array();
 
        if ( ($a__lines = file($a__in['pth'])) === FALSE )    {
 
            echo "Error: Couldn't open this file: " . $a__in . "\n";
            exit(1);
 
        }
 
        for ($i = 0; $i < count($a__lines); $i++)    {
 
            if ( preg_match("/" . $a__in['pat'] . "/", $a__lines[$i], $a__mat) !== 0 )    {
 
                $m__out = $a__mat[1];
                $b__continue = FALSE;
                break;
 
            }
 
        }
 
        return $m__out;
 
    }
 
    // DO NOT TOUCH THIS
    function pad($s__str, $i__num, $s__pos)    {
 
        switch ( $s__pos )    {
 
            case "l":
                $i__pos = STR_PAD_LEFT;
                break;
            case "r":
                $i__pos = STR_PAD_RIGHT;
                break;
            case "c":
                $i__pos = STR_PAD_BOTH;
                break;
            default:
                $i__pos = STR_PAD_LEFT;
                break;
        }
 
        return str_pad($s__str, $i__num, " ", $i__pos);
 
    }
 
    // DO NOT TOUCH THIS
    function net_parse($s__str, $s__x)    {
 
        $a__data = explode(" ", preg_replace("/[ ]+/", " ", $s__str));
        $s__out = NULL;
 
        switch ($s__x)    {
 
            case "rx":
                $s__out = $a__data[1];
                break;
 
            case "tx":
                $s__out = $a__data[9];
                break;
            default:
                break;
        }
 
        return $s__out;
 
    }
 
    // CUSTOM OUTPUT FUNCTION
    function pre_out($val, $me, $hi, $pad, $padir, $img)    {
 
        $clr = CLR_DEF;
        if ( $val >= $me )    { $clr = CLR_MED; }
        if ( $val >= $hi )    { $clr = CLR_HIG; }
        return "^fg($clr)^i(" . IMG_DIR . "/" . $img . ")^r(3x0)^fg(#e5e5e5)" . pad($val, $pad, $padir);
 
    }
 
    // CUSTOM OUTPUT FUNCTION FOR NETWORK INTERFACES WITH UNITS CONVERSION
    function pre_out_net($num, $pad, $padir, $img)    {
 
        $uac = array
            (
                0 => array
                    (
                        "uni" => "  Bps",
                        "clr" => CLR_DEF
                    ),
                1 => array
                    (
                        "uni" => "KiBps",
                        "clr" => CLR_DEF
                    ),
                2 => array
                    (
                        "uni" => "MiBps",
                        "clr" => CLR_MED
                    ),
                3 => array
                    (
                        "uni" => "GiBps",
                        "clr" => CLR_HIG
                    )
 
            );
 
        $i = 0;
        while( $num > 999.0 )    {
 
            $num /= 1024.0;
            $i++;
 
            if ( $i > 2 )    { break; }
 
        }
 
        return "^fg(" . $uac[$i]["clr"] . ")^i(" . IMG_DIR . "/$img)^r(3x0)^fg(#e5e5e5)" . pad(sprintf("%.1f", $num), $pad, $padir) . "^r(3x0)^fg(#c5c5c5)" . $uac[$i]['uni'];
 
    }
 
    // CUSTOM OUTPUT FUNCTION FOR MEMORY USAGE COUNT
    function count_used_mem()    {
 
        global $a__itm;
 
        $i__t = get_val($a__itm['memt']);
        $i__f = get_val($a__itm['memf']);
        $i__b = get_val($a__itm['memb']);
        $i__c = get_val($a__itm['memc']);
 
        return ceil(($i__t - $i__f - $i__b - $i__c) / 1024);
 
    }
 
    function pre_out_vol($val, $me, $hi, $pad, $padir, $img, $img2)    {
 
        $fimg = $img;
        $val = "0x$val";
 
        if ( $val > VOL_MIN )    {
 
            $fimg = $img2;
            $val -= VOL_MUT;
 
        }
 
        $perc = sprintf("%d", (0x0064 - ($val / (VOL_MIN / 0x0064))));
 
        $clr = CLR_DEF;
        if ( $perc >= $me )    { $clr = CLR_MED; }
        if ( $perc >= $hi )    { $clr = CLR_HIG; }
        return "^fg($clr)^i(" . IMG_DIR . "/" . $fimg . ")^r(5x0)^fg(#e5e5e5)" . pad($perc, $pad, $padir);
 
    }
 
    $eth0_rx_new = net_parse(get_val($a__itm["eth0"]), "rx");
    $eth0_tx_new = net_parse(get_val($a__itm["eth0"]), "tx");
    $eth0_rx_old = net_parse(get_val($a__itm["eth0"]), "rx");
    $eth0_tx_old = net_parse(get_val($a__itm["eth0"]), "tx");
 
 
    while (true)    {
 
        $a__lavg = sys_getloadavg();
 
        echo "^bg(#85a229)^r(2x0)^bg(#313433)^r(10x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out((get_val($a__itm['tp1']) / 1000), 45, 50, 3, "l", "temp-simple.xbm") . "^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out((get_val($a__itm['tp2']) / 1000), 45, 50, 3, "l", "temp-simple.xbm") . "^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out((get_val($a__itm['tp3']) / 1000), 45, 50, 3, "l", "temp-simple.xbm") . "^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out(sprintf("%.2f", $a__lavg[0]), 1.00, 2.00, 5, "l", 'loadavg.xbm') . "^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out(count_used_mem(), 1500, 3000, 4, "l", "ram.xbm") . "^r(3x0)^fg(#c5c5c5)MiB^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)" . pre_out_vol((get_val($a__itm['vol'])), 50, 85, 3, "l", "repro.xbm", "repro-off.xbm") . "^r(3x0)^fg(#c5c5c5)%^r(8x0)"
        . "^bg(#85a229)^r(1x0)^bg(#aac442)^r(5x0)^fg(#313433)" . date("H:i") . "^r(5x0)^bg(#85a229)^r(1x0)"
        . "^bg(#313433)^r(0x0)^bg(#85a229)^r(8x0)^fg(#212423)" . date("d.m.Y") . "^r(8x0)"
        . "^bg(#aac442)^r(2x0)^bg(#313433)^r(15x0)^fg(#e5e5e5)eth0^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)^r(5x0)^r(5x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)" . pre_out_net(($eth0_rx_new - $eth0_rx_old), 5, "l", "down_small.xbm") . "^r(15x0)"
        . "^bg(#313433)^r(1x0)^bg(#313433)" . pre_out_net(($eth0_tx_new - $eth0_tx_old), 5, "l", "up_small.xbm") . "^r(15x0)"
        . "^bg(#85a229)^r(2x0)"
        . "\n";
 
        $eth0_rx_old = net_parse(get_val($a__itm["eth0"]), "rx");
        $eth0_tx_old = net_parse(get_val($a__itm["eth0"]), "tx");
 
        sleep(1);
 
        $eth0_rx_new = net_parse(get_val($a__itm["eth0"]), "rx");
        $eth0_tx_new = net_parse(get_val($a__itm["eth0"]), "tx");
 
    }
 
    exit(0);
 
?>
 


Súbory na stiahnutie.
Posledná úprava Utorok, 21 Jún 2011 12:13
 
Services - IT Outsourcing
 

Jaroslav Petráš


asfethan

Narodený v roku 1988

moje profesie
 - programátor
 - GNU/Linux SysAdmin
 - Web developer
 - správca IT

moje záľuby
 - korčulovanie
 - squash
 - spoločenské akcie
 - hudba
 - autá
 - práca s IT

e-mail
   asfethan@cyberasylum.eu

jabber
   asfethan@cyberasylum.eu

Moja plocha


desktop screenshot

 - Debian GNU/Linux OS
 - XMonad
 - GNOME 3
 - gvim
 - xterm
 - dzen2
 - stalonetray
 - sysinfo-dzen2-php

Teamspeak 3 server


ts.niekde.sk
ts.cyberasylum.eu
  • free to use
  • for new permanent channels, informations or abuse reports please use e-mail address below

e-mail
   ts@cyberasylum.eu