26.2 偵測程式

接著,我們利用 Net::Ping 來寫一支簡單的偵測程式,如下:

#! /usr/bin/perl

use Net::Ping;
use strict;

# 網站主要目錄的路徑,請修改成您的現況
my $prefix="/home/apache/htdocs";

# 記錄檔路徑
my $ping_log = "$prefix/ping.log";
open(FHD, "> $ping_log") || die "$!\n";

my $p = Net::Ping->new('icmp');

# 欲偵測的主機 IP 列表,這裡只是舉例,請把它改成您管理的主機 IP
my @HOST=qw(
	10.1.1.1
	10.1.1.2
	10.1.1.3
	10.1.1.4
	10.1.1.222
);

my $i;
for ($i=0; $i<=$#HOST; $i++) {

	# 只 ping 一秒鐘,超過一秒鐘沒有反應,即視為斷訊
	# 若連通則 $result 值為 1,若斷訊 $result 值為 0
	my $result=$p->ping($HOST[$i], 1);

	# 取得時間
	my $now=get_time();

	# 寫入記錄檔 ping.log 中
	print FHD "$HOST[$i],$result,$now\n";
}

close(FHD);


# 取得時間的副程式
sub get_time {

	# 取得秒, 分, 時, 日, 月, 年 
	my ($sec,$min,$hour,$day,$mon,$year)=localtime(time);

	# 月比實際少一, 所以加 1
	$mon++;

	# 判斷是否為個位數, 若是則在前面補 0
	if (length ($mon) == 1) {$mon = '0'.$mon;}
	if (length ($day) == 1) {$day = '0'.$day;}
	if (length ($hour) == 1) {$hour = '0'.$hour;}
	if (length ($min) == 1) {$min = '0'.$min;}
	if (length ($sec) == 1) {$sec = '0'.$sec;}

	# 年比實際西元年少 1900, 所以加上 1900
	$year+=1900;

	# 組合成完整的時間
	my $alltime="$year/$mon/$day $hour:$min:$sec";

}

使用法:(需要 root 權限才能執行)

1. 將上述程式存成 ping.pl,放入 /root 中

2. 給執行權:

	chmod +x ping.pl

3. 放入 crontab 中,每 5 分鐘定時執行一次:

	crontab -u root -e

	*/5 * * * * /root/ping.pl