若干改良

uptimeを呼んで数値を得るのではなくて直接/procから数値を読むようにした。
同時にswapの空きが10Mを切ったときも、リスタートするように変更。

元の書き殴りじゃあんまりなのでちゃんとstrictとwarningsを指定した。しばらく使いそうだしね。

#!/usr/bin/perl
use strict;
use warnings;

my $limit15 = 10;
my $limit5  = 15;
my $limit1  = 30;
my $limitM  = 10 * 1024;

print "$limitM:$limit15:$limit5:$limit1\n";

while(1){

    my $swapFree = 0;
    my $load15 = 0;
    my $load5 = 0;
    my $load1 = 0;

    open MEMINFO,"/proc/meminfo" or die;

    while(<MEMINFO>){
        next unless /^SwapFree/;
        my @workTbl = split(/[\s:]+/);

        $swapFree = $workTbl[1]+0;
    }

    close MEMINFO;

    open UPTIME,"/proc/loadavg" or die;

    while(<UPTIME>){
        my @workTbl = split(/[\s,]+/);

        $load15 = $workTbl[2] + 0;
        $load5 = $workTbl[1] + 0;
        $load1 = $workTbl[0] + 0;
    }

    close UPTIME;

    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
    $mon += 1;
    $year += 1900;

    if($load15 > $limit15){
        if($load5 > $limit5){
            if($load1 > $limit1){
                print '('. join(':',($swapFree,$load1,$load5,$load15)).") restart at $year/$mon/$mday $hour:$min:$sec : cpu busy\n" ;
                system("/sbin/service httpd restart");
                sleep(60);
            }
            else {
                print ' ('. join(':',($swapFree,$load1,$load5,$load15)).") step2 at $year/$mon/$mday $hour:$min:$sec \n" ;
            }
        }
        else {
            print ' ('. join(':',($swapFree,$load1,$load5,$load15)).") step1 at $year/$mon/$mday $hour:$min:$sec \n" ;
        }
    }

    if($swapFree <= $limitM){
        print '('. join(':',($swapFree,$load1,$load5,$load15)).") restart at $year/$mon/$mday $hour:$min:$sec : memlow \n" ;
        system("/sbin/service httpd restart");
        sleep(30);
    }
    sleep(10);
}

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください