PHPとShell Command

更新日2016-10-15 (土) 22:26:00

Ping 実行shell

次のmypingというshellで出るlogをWebで表示

#! /bin/sh
date >> ~okada/log/pinglog
ping -c3 202.59.187.76 >> ~okada/log/pinglog

Ping 実行shell Web表示サンプル

<?php

$match ="^rtt";
$fp = popen("/usr/bin/tail -200 ~okada/log/pinglog", "r");
while (!feof($fp)) {
        $line = fgets($fp, 1024);
        printf("%s <br>\n", $line);
        if (mb_ereg($match, $line)) {
                echo " <HR> Date : ";
        }
}

pclose($fp);

?>

サンプル

Pingでリモートの監視(Error時メール自動発信)

以下のshellスクリプトをpinglog生成のため作成し、cronに登録

#! /bin/sh
export LANG=ja_JP.eucJP

date > ~okada/log/pinglog.err
ping -c2 wwwism.dyndns.org >> ~okada/log/pinglog.err 2>&1 <==標準エラーも記録
ping -c2 202.91.212.66 >> ~okada/log/pinglog.err
/home/okada/script/icmpcheckmail.php > /dev/null 2>&1 <=nullに全てリダイレクトしないとcron実行ごと、管理メールが配信される。

icmpcheckmail.phpで

#!/usr/local/bin/php -q

<?php

//Ping(ICMP)でパケットロスしたらメールを送る

        $mailaddress = "okada@abc.ac.jp";

        $fp = @fopen("/home/okada/log/pinglog.err", "r");
        if (!$fp) exit;
        $flag = 0;
        $msg= "";
        $s0 = "";
        $s = "";
        while(!feof($fp)){
                $s = fgets($fp, 4096);
                $msg = $msg . $s;
                if(strpos($s, "パケット損失 100%")){//ROUTER ERR :3
                        if(strpos($s0, "wwwism")){//DDNS ERROR :1
                                $flag = $flag + 1;
                        }else{// DHCP Changed :2
                                $flag = $flag + 2;
                        }
                }
                //DDNS Servce Error: DDNSで名前解決してくれない
                if(strpos($s, "不明なホスト")) $flag = $flag + 4;
                $s0 = $s;
        }

        if ($flag == 0) exec("/bin/echo 0 > /home/okada/log/pinglog.flag");

        fclose($fp);

//ファイルから1行ごと配列の取り込む
        $array = file("/home/okada/log/pinglog.flag");
        $fflag = $array[0];

//メール送信
        if($flag != 0 && $fflag == 0){

                if($flag == 1){
                        $subject = "DDNS Error";
                }else if($flag == 2){
                        $subject = "DHCP Changed";
                }else if($flag == 3){
                        $subject = "ROUTER Error";
                }else{
                        $subject = "DDNS Service Error";
                }
                $subject = mb_convert_encoding($subject, "ISO-2022-JP", "EUC-JP");
                $subject = mb_encode_mimeheader($subject, "ISO-2022-JP", "B");

                $fp = popen("/usr/bin/nkf -m0 | /usr/sbin/sendmail -oi -t","w");
                fwrite($fp, "From: okada@abc.ac.jp\n");
                fwrite($fp, "Reply-To: okada@abc.ac.jp\n");
                fwrite($fp, "To: ". $mailaddress . "\n");
                fwrite($fp, "Subject: " . $subject ."\n");
                fwrite($fp, "Mime-Version: 1.0\n");
                fwrite($fp, "Content-Type: text/plain; charset=ISO-2022-JP\n\n");
                fwrite($fp, $msg . "\n");
                pclose($fp);
                //一度メールを送ったら、2回目のメールは出さないようにする
                exec("/bin/echo 1 > /home/okada/log/pinglog.flag");
        }
?>

その後

$ chmod a+x icmpcheckmail.php

で実行権を与える

/home/okada/log/pinglog.flagは0のときは正常1:のときはなんらかのエラー時で、このファイルに1があるときは、メール送信しない。初めてエラーになるときは0なのでメール送信し、その後1を立てるので、同じ内容を複数回メール送信しないようにしている。


元ページ

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS