nagios插件check_squid报错的问题解决方法

http://workaround.org/squid/nagios-plugin/check_squid的脚本用来检测squid很好用,但有时会报错:

Parsing of undecoded UTF-8 will give garbage when decoding entities at /usr/lib/perl5/vendor_perl/5.8.5/LWP/Protocol.pm line 114.

原因是:
HTML::HeadParser模块在使用parse()方法时,对没有编码的UTF-8会弄混,要保证在传值之前进行适当的编码。
参考:http://www.xinjiezuo.com/blog/?p=43

解决方式是加入一行:

$ua->parse_head(0);

跳过去就好了。

下面是改过后的check_squid.

#!/usr/bin/perl -w
#
# check_squid – Nagios check plugin for testing a Squid proxy
#
# Christoph Haas (email@christoph-haas.de)
# License: GPL 2
#
# V0.2
#

use LWP::UserAgent;
use HTTP::Request::Common qw(POST GET);
use HTTP::Headers;
use strict;

my ($url, $urluser, $urlpass, $proxy, $proxyport,
        $proxyuser, $proxypass, $expectstatus) = @ARGV;

unless ($url && $proxy && $expectstatus)
{
        print "Usage: url urluser urlpass proxy proxyport proxyuser proxypass expectstatusn";
                                print " url       -> The URL to check on the internet (http://www.google.com)n";
                                print " urluser   -> Username if the web site required authentication (- = none)n";
                                print " urlpass   -> Password if the web site required authentication (- = none)n";
                                print " proxy     -> Server that squid runs on (proxy.mydomain)n";
                                print " proxyport -> TCP port that Squid listens on (3128)n";
                                print " proxyuser -> Username if the web site required authentication (- = none)n";
                                print " proxypass -> Password if the web site required authentication (- = none)n";
                                print " expectstatus -> HTTP code that should be returnedn";
                                print "                  (2 = anything that begins with 2)n";
        exit -1;
}

$urluser=” if $urluser eq ‘-‘;
$urlpass=” if $urlpass eq ‘-‘;
$proxyuser=” if $proxyuser eq ‘-‘;
$proxypass=” if $proxypass eq ‘-‘;

my $ua = new LWP::UserAgent;
$ua->parse_head(0); //加入这行就好了

my $h = HTTP::Headers->new();

if ($proxy)
{
        $ua->proxy([‘http’, ‘ftp’], "http://$proxy:$proxyport");

        if ($proxyuser)
        {
                $h->proxy_authorization_basic($proxyuser,$proxypass);
        }
}

if ($urluser)
{
        $h->authorization_basic($urluser, $urlpass);
}

my $req = HTTP::Request->new(‘GET’, $url, $h);

my $res = $ua->request($req);

if ($res->status_line =~ /^$expectstatus/)
{
        print "OK – Status: ".$res->status_line."n";
        exit 0;
}
else
{
        print "WARNING – Status: ".$res->status_line." (but expected $expectstatus…)n";
        exit 1;
}

nagios配置文件的关系和理解

Nagios能实现的具体的功能正是通过配置文件来表现的。而这些配置文件之间有着千丝万缕的关系。比如services依赖于host,timeperiod和contactgroup等。       Nagios.cfg这是nagios的主配置文件,它主要负责管理其他所有跟nagios有关的文件。他定义了nagios的日志文件,缓冲文件,状态信息存放文件等。还有其他所有的配置文件等。这些主要的配置文件如下:1.        hosts.cfgdefine host{host_name                                 #这一项是用来定义标识主机的名字。我们用这个名字在host group和service里标识这个主机。一个主机能定义多个服务。使用适当时,宏$HOSTNAME$里存放了这一项的值。alias                                          #这一项用来定义主机的一个完整名字或描述。主要是和使你能理容易的标识一个主机。使用适当时,宏$HOSTALIAS$里存放了这一项的值。address                                    #这一项是用来定义主机的地址。一般而言是主机的IP。当然,你也能够使用一个FQDN来标识你的主机,在没有可访问DNS服务器服务的情况下这种方法会引起问题。使用适当时,宏$ HOSTADDRESS $里存放了这一项的值。max_check_attempts                  #这一项用来定义在检测返回结果不是OK时,nagios重试检测命令的次数。设置这个值为1会导致nagios一次也不重试就报警。check_period                            #这一项用一个time period项的名字来定义在哪段时间内激活对这台主机的主动检测。time period是定义在别的文件里的配置项,我们可以在这里用名字来引用她。contact_groups                          #这是一个联系组列表。我们用联系组的名字来引用她们。多个联系组间用“,”来分隔。notification_interval                     #这一项用来定义当一个服务仍然down或unreachable时,我们间隔多久重发一次通知给联系组。notification_period                      #这一项用一个time period定义来标识什么时间段内给联系组送通知。这里我们用time period定义的名字来引用她。notification_options                   #这一项用来决定发送通知的时机。选项有:d = 当有down状态时发送通知,u = 当有unreachable状态时发送通知, r = 当有服务recoveries时发送通知,f = 当主机启动或停机时发送通知。如果你给一个n选项,那么永远不会发送通知。            }2.        hostgroups.cfgdefine hostgroup{               hostgroup_name                          #主机组名称,通常定义得较短                alias                                          #主机组别名,通常定义得较长               members                                    #主机组成员              }3.        services.cfgdefine service{               host_name                                  #主机名称               service_description                      #服务描述               check_command                         #执行命令       max_check_attempts                   #最大失败尝试次数,值为1时只报警不重新检测                            normal_check_interval                 #常规检测间隔时间,默认为60分钟                                                                             (常规检测是指无论服务状态是否正常,检测次数达到“最大次数”时)                            retry_check_interval                    #失败尝试间隔时间,默认为60分钟                                                                             (失败尝试是指服务状态不正常,检查次数达到“最大次数”时)               check_period                              #检测时间段               notification_interval                     #当服务状态不正常时通知联系人的间隔时间,值为0时不通知联系人notification_period                       #通知联系人时间段               notification_options                     #通知联系人选项,w警告,u未知,c危急,f启动和停止,n不发送通知               contact_groups                           #联系人组              }4.        servicegroups.cfgdefine servicegroup{               servicegroup_name                      #服务组名称,通常定义得较短                       alias                                #服务组别名,通常定义得较长               members                          #服务组成员              }5.        contacts.cfgdefine contact{contact_name                             #这个指令用来定义一个联系人的简称。他会在定义contactgroup时被引用到。在相应的环境中,宏定义$CONTACTNAME$会包含这个值。alias                                           #这个指令是为了定义一个联系人的具体的描述。在相应的环境中,宏定义$CONTACTALIAS$会包含这个值。host_notification_period               #这个指令是为了定义,能够通知Contact中定义的那个简称联系人,关于主机有问题或者恢复正常状态的时间段。你可以把他想象成能够通知Contact关于主机的在线时间。service_notification_period                  #这个指令是为了定义,能够通知Contact中定义的那个简称联系人,关于服务的问题或恢复正常的时间段。host_notification_options                     #这个指令为了定义主机在什么状态下会给联系人发通知。各个参数的描述如下:d=当主机的状态处于down时,发送通知;f=当主机状态处于stop时发送通知。r=当主机恢复up状态时发送通知。n=什么状态下都不发送通知。service_notification_options                 #这个指令为了定义服务在什么状态下会给联系人发通知。各个参数的描述如下:w=当服务处于警告状态时发送通知 u=当服务的状态处于unknown时,发送通知;f=当服务状态处于启动和停止时发送通知。c=当服务处于Critical状态时发送通知。n=什么状态下都不发送通知。host_notification_commands               #这个指令是为了定义一个通知联系人关于主机问题或恢复正常的联系手段的一个列表。多个手段之间用逗号隔开。service_notification_commands    #这个指令是为了定义一个通知联系人关于服务问题或恢复正常的联系手段的一个列表。多个手段之间用逗号隔开。email                                                 #这个指令是为了定义联系人的email地址。这个将取决于你是如何定义你的notification commands.它可以用来给联系人发送紧急邮件。在相应的环境中。宏定义$CONTACTEMAIL$将会包含它的值。}6.        contactgroups.cfgdefine contactgroup{               contactgroup_name                            #联系组名称,通常定义得较短               alias                                #联系组别名,通常定义得较长               members                          #联系组成员              } 7.        timeperiods.cfgdefine timeperiod{               timeperiod_name                         #时间段名称,通常定义得较短               alias                                           #时间段别名,通常定义得较长               sunday                                       #星期日时间段               monday                                      #星期一时间段               tuesday                                      #星期二时间段               wednesday                                 #星期三时间段               thursday                                     #星期四时间段               friday                                         #星期五时间段               saturday                                     #星期六时间段            }8.        commands.cfg        define command{           command_name       #定义命令的简称           command_line       #定义当服务进行时Nagios要执行的动作。在命令执行以前,所有合法的宏都要被他们的值代替。           }

Nagios 配置(转)

主配置文件 nagios.cfg 需要更改的地方:
#cfg_file=/usr/local/nagios/etc/objects/localhost.cfg
interval_length=1 ; 间隔时间基准由 60s 改为 1s
command_check_interval=10s ; 命令检查时间间隔,-1 表示尽可能频繁的进行检查
date_format=iso8601 ; 日期格式

objects/contacts.cfg 用来定义联系人:

define contact {
contact_name sa
alias System Administrator
service_notification_period 24×7
host_notification_period 24×7
service_notification_options w,u,c,r
host_notification_options d,u,r
service_notification_commands notify-service-by-email
host_notification_commands notify-host-by-email
email admin@test.com
}

再定义联系人组

define contactgroup {
contactgroup_name admins
alias Administrator Group
members sa ; 添加其它联系人用 "," 分隔
}

主机监控的配置

define host {
host_name host_name ; 简短的主机名称。
alias alias ; 别名,可以更详细的说明主机。
address address ; IP 地址,也可以写主机名。如果不定义这个值, nagio 将会用 host_name 去寻找主机。
parents host_names ; 上一节点的名称,也就是指从 nagios 服务器到被监控主机之间经过的节点,可以是路由器、交换机、主机等等。
hostgroups hostgroup_names ; 简短的主机组名称。
check_command command_name ; 检查命令的简短名称,如果此项留空, nagios 将不会去判断主机是否 alive 。
max_check_attempts 整数 ; 当检查命令的返回值不是 "OK" 时,重试的次数。
check_interval 数字 ; 循环检查的间隔时间。
active_checks_enabled [0/1] ; 是否启用 "active_checks"
passive_checks_enabled [0/1] ; 是否启用 "passive_checks" ,及“被动检查”
check_period timeperiod_name ; 检测时间段简短名称,这只是个名称,具体的时间段要写在其他的配置文件中。
obsess_over_host [0/1] ; 是否启用主机操作系统探测。
check_freshness [0/1] ; 是否启用 freshness 检查。freshness 检查是对于启用被动检查模式的主机而言的,其作用是定期检查主机报告的状态信息,如果该状态信息已经过期,freshness 将会强制做主机检查。
freshness_threshold 数字 ; fressness 的临界值,单位为秒。 如果定义为 "0" ,则为自动定义。
event_handler command_name ; 当主机发生状态改变时,采用的处理命令的简短的名字(可以在 commands.cfg 中对其定义)
event_handler_enabled [0/1] ; 是否启用 event_handler
low_flap_threshold 数字 ; 抖动的下限值。抖动,即在一段时间内,主机(或服务)的状态值频繁的发生变化。
high_flap_threshold 数字 ; 抖动的上限值。
flap_detection_enabled [0/1] ; 是否启用抖动检查。
process_perf_data [0/1] ; 是否启用 processing of performance data
retain_status_information [0/1] ; 程序重启时,是否保持主机状态相关的信息。
retain_nonstatus_information [0/1] ; 程序重启时,是否保持主机状态无关的信息。
contact_groups contact_groups ; 联系人组,在此组中的联系人都会收到主机的提醒信息。
notification_interval 整数 ; 重复发送提醒信息的最短间隔时间。默认间隔时间是 "60" 分钟。如果这个值设置为 "0" ,将不会发送重复提醒。
notification_period timeperiod_name ; 发送提醒的时间段。非常重要的主机(服务)定义为 24×7 ,一般的主机(服务)就定义为上班时间。如果不在定义的时间段内,无论发生什么问题,都不会发送提醒。
notification_options [d,u,r,f] ; 发送提醒包括的情况: d = 状态为 DOWN , u = 状态为 UNREACHABLE , r = 状态恢复为 OK , f = flapping
notifications_enabled [0/1] ; 是否开启提醒功能。"1" 为开启,"0" 为禁用。一般,这个选项会在主配置文件 (nagios.cfg) 中定义,效果相同。
stalking_options [o,d,u] ; 持续状态检测参数,o = 持续的 UP 状态 , d = 持续的 DOWN 状态 , u = 持续的 UNREACHABLE 状态
}

服务监控的配置

define service {
host_name host_name
service_description service_description
servicegroups servicegroup_names
is_volatile [0/1]
check_command command_name
max_check_attempts
normal_check_interval
retry_check_interval
active_checks_enabled [0/1]
passive_checks_enabled [0/1]
check_period timeperiod_name
parallelize_check [0/1]
obsess_over_service [0/1]
check_freshness [0/1]
freshness_threshold
event_handler command_name
event_handler_enabled [0/1]
low_flap_threshold
high_flap_threshold
flap_detection_enabled [0/1]
process_perf_data [0/1]
retain_status_information [0/1]
retain_nonstatus_information [0/1]
notification_interval
notification_period timeperiod_name n
otification_options [w,u,c,r,f]
notifications_enabled [0/1]
contact_groups contact_groups
stalking_options [o,w,u,c]
}

服务监控的配置和主机监控的配置较为相似,就不一一说明了。

间隔时间的计算方法为:
normal_check_interval x interval_length 秒
retry_check_interval x interval_length 秒
notification_interval x interval_length 秒

主机监控配置的例子

define host {
host_name web1
alias web1
address 192.168.0.101
contact_groups admins
check_command check-host-alive
max_check_attempts 5
notification_interval 0
notification_period 24×7
notification_options d,u,r
}

对主机 web1 进行 24×7 的监控,默认会每 10 秒检查一次状态,累计五次失败就发送提醒,并且不再重复发送提醒。

服务监控配置的例子

define service {
host_name web1
service_description check_http
check_period 24×7
max_check_attempts 3
normal_check_interval 30
contact_groups admins
retry_check_interval 15
notification_interval 3600
notification_period 24×7
notification_options w,u,c,r
check_command check_http
}

配置解释: 24×7 监控 web1 主机上的 HTTP 服务,检查间隔为 30 秒, 检查失败后每 15 秒再进行一次检查,累计三次失败就认定是故障并发送提醒。
联系人组是 admins 。提醒后恢复到 30 秒一次的 normal_check_interval 检查。如果服务仍然没有被恢复,每个小时发送一次提醒。

如果要检测其他服务,例如,要检查 ssh 服务是否开启,更改如下两行:
service_description check_ssh
check_command check_ssh

为方便管理,对配置文件的分布做了如下修改:
nagios.cfg 中增加了:
cfg_dir=/usr/local/nagios/etc/hosts
cfg_dir=/usr/local/nagios/etc/services

在 hosts 目录中,为不同类型的主机创建了配置文件,如: app.cfg cache.cfg mysql.cfg web.cfg
并创建了 hostgroup.cfg 文件对主机进行分组,如:

define hostgroup {
hostgroup_name app-hosts
alias APP Hosts
members app1,app2
}

在 services 目录中创建了各种服务的配置文件,如: disk.cfg http.cfg load.cfg mysql.cfg
并创建了 servicegroup.cfg 文件对服务进行分组,如:

define servicegroup {
servicegroup_name disk
alias DISK
members cache1,check_disk,cache2,check_disk
}

monit 监控并自动重启服务

Monit是一款功能非常丰富的进程、文件、目录和设备的监测软件,用于Unix平台。 它可以自动修复那些已经停止运作的程序,特使适合处理那些由于多种原因导致的软件错误。monit运行于应用层安装很简单,三部曲#./configure#make#make install 复制配置文件# cp monitrc /etc/monitrc 接下来我们根据实际情况来修改这个配置文件set daemon 120 # Poll at 2-minute intervals//每2分钟检查一次
set logfile /home/monit/log/monit.log          //monit的日志文件
set alert with reminder on 1 cycle //出现1次错误的时候发报警邮件到指定的邮箱
#set mailserver mail.tildeslash.com, mail.foo.bar port 10025, localhost with tim
eout 15 seconds
set mailserver 10.10.9.109    //设置邮件服务器set httpd port 2812 and use address 10.10.8.2 //设置http监控页面的端口和ip
    allow localhost   # Allow localhost to connect //允许本机访问
    allow 10.10.8.0/24                                            //允许此IP段访问
    allow admin:nishiwode # Allow Basic Auth   //认证的用户名和密码# all system                                                         //平均负载.内存使用率,cpu使用率
check system 10.10.8.2
   if loadavg (1min) > 4 then alert
   if loadavg (5min) > 2 then alert
   if memory usage > 75% then alert
   if cpu usage (user) > 70% then alert
   if cpu usage (system) > 30% then alert
   if cpu usage (wait) > 20% then alert# all disk                                                              //磁盘空间使用率
check device data with path /dev/sda2
   if space usage > 90% then alert
   if inode usage > 85% then alertcheck device home with path /dev/sda3
   if space usage > 85% then alert
   if inode usage > 85% then alert
# all rsync#10.10.8.2
check process sshd with pidfile /var/run/sshd.pid
start program "/etc/init.d/sshd start"
stop program "/etc/init.d/sshd stop"
if failed host 127.0.0.1 port 22 protocol ssh then restart
if 5 restarts within 5 cycles then timeout//监控ssh服务
check process httpd with pidfile /var/run/httpd.pid
group apache
start program = "/etc/init.d/httpd start"
stop program = "/etc/init.d/httpd stop"
if failed host 127.0.0.1 port 80
protocol http then restart
if 5 restarts within 5 cycles then timeout
//监控http服务
//监控自定义服务
check process web_lb with pidfile /data/v20/server/web_lb/httpd.pid
    start program = "/data/v20/bin/lb.sh" //启动脚本
    stop program = "/data/v20/bin/lb_stop.sh" //停止脚本
    if failed host 10.10.8.2 port 16101 proto http then restart
    if failed host 10.10.8.2 port 16101 proto http for 5 times within 5 cycles t
hen exec "/data/v20/bin/lb_pay.sh"
    if failed host 10.10.8.2 port 16102 type TCPSSL proto http then restart
    if failed host 10.10.8.2 port 16102 type TCPSSL proto http for 5 times withi
n 5 cycles then exec "/data/v20/bin/lb_pay.sh
RHEL可以用如下方法启动monit
# vi /etc/inittab
添加:
mo:2345:respawn:/usr/local/bin/monit -Ic /etc/monitrcNow start monit:
# init -q或者# telinit -q
You can verify that monit is started from /var/log/message log file:
# tail -f /var/log/message
如果正常启动能看到如下输出:
Nov 21 04:39:21 server monit[8759]: Starting monit daemon
Nov 21 04:39:21 server monit[8759]: Monit started

最后可以测试一下,看看是否有让你满意的效果.

Nagios on CentOS

Prerequisites

* Apache HTTP Server
* GCC compiler
* GD development libraries

yum install httpd
yum install gcc
yum install glibc glibc-common
yum install gd gd-devel

Create a new nagios user account and give it a password.

/usr/sbin/useradd nagios
passwd nagios

Create a new nagcmd group

/usr/sbin/groupadd nagcmd
/usr/sbin/usermod -G nagcmd nagios
/usr/sbin/usermod -G nagcmd apache

Download

wget http://osdn.dl.sourceforge.net/s … agios-3.0rc2.tar.gz
wget http://osdn.dl.sourceforge.net/s … ugins-1.4.11.tar.gz
tar xzf nagios-3.0rc2.tar.gz
cd nagios-3.0rc2

Build

./configure –with-command-group=nagcmd
make all
make install
make install-init
make install-config
make install-commandmode

Configuration

vi /usr/local/nagios/etc/objects/contacts.cfg

Configure the Web Interface

make install-webconf
htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin
service httpd restart

Compile and Install the Nagios Plugins

tar xzf nagios-plugins-1.4.11.tar.gz
cd nagios-plugins-1.4.11
./configure –with-nagios-user=nagios –with-nagios-group=nagios
make
make install

Start Nagios

chkconfig –add nagios
chkconfig nagios on
/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg
service nagios start

Modify SELinux Settings

getenforce
setenforce 0
chcon -R -t httpd_sys_content_t /usr/local/nagios/sbin/
chcon -R -t httpd_sys_content_t /usr/local/nagios/share/

Login to the Web Interface

http://localhost/nagios/
username (nagiosadmin) and password you specified earlier

参考: http://nagios.sourceforge.net/docs/3_0/quickstart-fedora.html

系统监控:msn在线机器人实时报警

作者:Michael Field
一、实际需求
在应用各种监控软件(比如:cacti、nagios、sitescope等)的时候,我一般都会用到它的email阀值报警功能。如果这时候再加上一个 msn在线监控机器人为你把关,第一时间给你发出msn报警信息,是不是能让你更快的处理问题呢。以下我为大家介绍一个msn command line 的小程序来实现这个功能。
软件下载地址:sendMsg: http://downloads.fanatic.net.nz/dev/php/sendMsg.zip
二、运行环境
一个支持php的系统环境就可以啦,当然要能上网,不然怎么发消息呢。
我的做法是和cacti监控服务器放一起,不需要额外的设备和资源投入。
注册一个msn的帐号用于监控机器人。比如: 密码:123456
需要收到消息的msn帐号必须加监控帐号为好友,不然收不到消息。

三、sendMsg用法
sendMsg.zip包中所有文件如下:
# ls -l sendMsg/
-rw-r–r– 1 root root 1213 Jul 29   2007 index.php //测试页面,web中打开开始测试;很容易做。
-rw-r–r– 1 root root 3894 Jul 29   2007 msnpauth-1.1.3.php
-rw-r–r– 1 root root 3372 Jul 29   2007 msnpauth.php
-rw-r–r– 1 root root 4586 Jul 29   2007 sendMsg.php
-rw-r–r– 1 root root   223 Jul 29   2007 simple.php
-rw-r–r– 1 root root 1424 Jul 29   2007 template.tpl

该程序也是通过登录msn服务器、建立IM会话,发送消息;
基本PHP语法如下:
$sendMsg = new sendMsg();
$sendMsg->login(‘test@test.com’, ‘123456’);
//刚才建立的用于举例的msn监控机器人帐号
$sendMsg->createSession(‘recipient@hotmail.com’);
//接受信息人的msn帐号
$sendMsg->sendMessage(‘message’, ‘Times New Roman’, ‘FF0000’);
//第一个是具体信息内容,后面可以设定字体和颜色;
$sendMsg->sendMessage(iconv("GBK", "UTF-8", 测试), ‘Times New Roman’, ‘008000’);
//也利用iconv转换gbk到utf8来发送中文信息;

效果如下:

四、实际应用
这里是我自己写的一个应用发送msn信息的php脚本:仅供参考,如果大家有更好请和我交流。
#!/usr/bin/php
<?
if ($argc != 3) {
die("Usage: send_cndmonitor.php <msn-address> <messages>n");
}
array_shift($argv);
$msnaddr = $argv[0];
$messages = $argv[1];
include(‘sendMsg.php’);
$sendMsg = new sendMsg();
$sendMsg-&gt;login(‘test@test.com’, ‘123456’);
$sendMsg-&gt;createSession($msnaddr);
$sendMsg-&gt;sendMessage($messages, ‘Times New Roman’, ‘008000’);
?>

主要是为了能被其他脚本调用,用于发送一个报警信息。缺点是不能判定错误,所以时机运用中存在故障,需要网络流畅的环境下使用。

我们的生产环境已经存在大量的监控系统,所以针对错误信息已经整理到数据库中,因此我只需要从数据库导出目前存在error信息的文本文件,然后根据节点位置发送给相关维护负责人即可。

为了能判定和确保发送正确,我利用sendMsg中的index.php的页面和shell脚本相结合来循环发送,实在抱歉本人PHP程度有限;
脚本如下:(这是我实例用使用的一个工作脚本,仅供大家借鉴)
#!/bin/sh
wget –user=monitor –password=123456 http://127.0.0.1/monitor/msn.txt -O /var/www/html/sendMsg/msn.txt.1 >/dev/null 2>&1
#下载msn要发送的信息,因为页面都是认证的所以用了wget的user和password;
now=`date +%Y-%m-%d-%H:%M`
[ -f /var/www/html/sendMsg/msn.txt ] && oldmd5=`md5sum msn.txt |awk ‘{print $1}’ |tee /var/log/cdn_status_old.md5` || exit 0
[ -f /var/www/html/sendMsg/msn.txt.1 ] && newmd5=`md5sum msn.txt.1 |awk ‘{print $1}’ |tee /var/log/cdn_status_new.md5` || exit 0
SA=(admin1 admin2 admin3 admin4)
# 相关负责人列表和下载的msn信息的中的名字对应;
msnaddr=( )
# 相关负责人的msn帐号和SA变量中的的名字顺序一一对应;
sendMsg()
{
num=0
while [ $num -lt 1 ];
do
wget –post-data "sender=test@test.com&password=123456&recipient=${1}&message=${2}" http://127.0.0.1/sendMsg/index.php -O /var/www/html/sendMsg/index.php.1 >/dev/null 2>&1
# 使用wget post-data发送post参数给index.php页面,用以发送msn信息。
if [ -f /var/www/html/sendMsg/index.php.1 ]; then
if cat /var/www/html/sendMsg/index.php.1 |grep -i successfully >/dev/null 2>&1;then
num=1 #判断信息发送成功
elif cat /var/www/html/sendMsg/index.php.1 |grep -i "The user appears to be offline" >/dev/null 2>&1;then
num=1 #判断msn接受人为是否在线状态
echo "The user is offline."
exit 0
elif cat /var/www/html/sendMsg/index.php.1 |grep -i "Something went wrong trying to connect to the server" >/dev/null 2>&1;then
num=1 #判断msn 服务器存在连接问题
echo "MSN server is wrong."
exit 0
else
num=0 #除了以上三种情况退出循环外,其他情况重试。
fi
rm -f /var/www/html/sendMsg/index.php.1
else
num=0
fi
done
}

if [[ $oldmd5 == $newmd5 ]];then #校验msn的信息是否是已经发送过的,主要是为了不重复发送错误信息。
rm -f /var/www/html/sendMsg/msn.txt.1
exit 0
else
mv /var/www/html/sendMsg/msn.txt /var/www/html/sendMsg/bak/msn$now.txt -f
mv /var/www/html/sendMsg/msn.txt.1 /var/www/html/sendMsg/msn.txt -f
#备份已发送的msn错误信息

fi

for i in `seq 0 1 3` #根据维护人员的数量进行判断和循环
do
if cat /var/www/html/sendMsg/msn.txt |grep -i ${SA[$i]}; then
messages=`cat /var/www/html/sendMsg/msn.txt |grep -i ${SA[$i]}`
sendMsg "${msnaddr[$i]}" "$messages"
else
continue
fi
done

加入到crontab每5分钟执行一次;考虑维护人员的上线时间(最好是24H值班msn,那就不存在这个问题)设定执行时间为每周1到5的9点到18点;
*/5 10-19 * * 1-5 /var/www/html/sendMsg/send_report.sh

实际应用大家可以根据自己的情况进行调整,我这里只是告诉大家怎么使用sendmsg,举了一个简单的实例帮助大家理解和应用。

如果懂php语言的可以把这个作为cacti的一个插件使用,那样效果就更棒啦~

使用Perl实现系统服务监控和报警(zt)

作者:heiyeluren
博客:http://blog.csdn.net/heiyeshuwu
时间:2008-5-22

一般的Web站点来说,都包括很多服务和应用,我们没法实时知道系统运行是否正常,特别是晚上的时候,如果服务器宕机或应用挂掉了,都会影响业务和用户访问,这时候一套对系统监控的错设就必须得当。目前有很多软件应的监控通知和报警服务,有收费的也有免费的,大家都可以选择。

我们就尝试自己来实现一个服务监控和报警通知的程序,这样能够使用很小的代价,同样让我们的服务高可用性和高可靠性。

【监控原理】

远程服务
对于远程机器来说,我们可以有一台监控服务器,或者随便找一台比较不容宕机的服务器来作为监控服务器,那么就能够监控其他的服务机上的服务了,远程监控是比较大家需要的方式了。一般远程监控就监控服务器和端口是否开放,比如说,我们的 Web 服务 Apache 一般都会开放 80 端口,那么我们就可以通过访问这台服务器的 80 端口来确定 Apache 是否在正常工作,如果无法连接上,那么说明该服务就停止了。

本地服务
对于本机来说,监控进程和日志文件都 是可行的,一般来说,长期频繁工作的服务,比如 Apache 都会在每次访问后把访问信息记录到 access 访问日志文件里,如果这个文件长时间没有更新,就可以怀疑该服务已经停止了(当然了,不排除,这段时间内都没有人访问的情况)。另外对于进程来说,本机是 很容易可以查看到进程情况的,对于 MySQL 等服务器来说,守护进程都是长期开放的,如果发现当前系统中没有了 MySQL 守护进程,那么也可以确认 MySQL 服务已经停止了。

报警通知
服务停止了,自然需要通知系统维护人员,那么一般就是通过邮件或者短信的方式,短信是最好的了,但是频繁短信同样让维护人员很郁闷,这个叫做短信炸弹(Message Bomb),所以邮件也许是个简单实在的方式,本地再配置上 Outlook/Foxmail 定期接收和通知方式,也比较快捷,但是晚上回家后,一般都无法收到邮件了,所以合理的方式是白天邮件通知,晚上和周末短信通知 的报警方式更合理。

【代码实现】

具体代码实现可以使用各种代码了,C/C++、Ruby、Python、PHP ,只要能够访问文件、Socket ,能够定期执行的语言都可以,我们下面的代码采用 Perl 来构建,因为 Perl 是很好的系统管理脚本语言,任何 Unix/Linux 都缺省安装了 Perl 引擎,能够很方便的在任何机器上面运行,同时 Perl 的灵活性强,而且有强大的 CPAN 包库,所以编写代码很方便,在系统管理中也是值得推荐大家使用的,当然了,很多系统管理工作使用 shell 脚本也许更方便。

下面的代码实现对远程监控、本地日志文件监控、本地进程监控都进行了实现,但是只使用了远程端口监控的方式,因为这样就能够监控多台机器和服务了,如果只 是单台机器或者只是想监控本地进程,可以很简单的修改主函数来实现。同时通知方式主要是采用邮件通知的方式,并且函数实现了SMTP协议进行邮件发送(因 为我发现Perl内置的 Net::SMTP 在进行型验证的时候,并不是很靠谱),当然了,在报警通知方面,完全可以改写成发送短信或者按照时间来分别调用短信和邮件的方式。

代码中主要监控了包括   Apache、MySQL、Memcache、Search(假如你有的话)等服务,可以在这个基础上进行增删不同的服务器监控,只需要增加一个常量配置和修改 main 函数代码。

说明:以下Perl代码在 RHEL 4 + Perl v5.8.6 环境下测试通过复制内容到剪贴板代码:#!/usr/bin/perl
use IO::Socket;
use IO::File;
use MIME::Base64;

##############################
# Constant define (configure)
##############################
# mail config
use constant MAIL_ADDR       => ('to'=>'webmaster@example.com', 'from'=>'webmaster@example.com');
use constant SMTP_INFO       => ('host'=>'smtp.example.com', 'user'=>'webmaster', 'password'=>'pass',
                                 'debug'=>1, 'bufsize'=>1024);
# common config
use constant MD5SUM_FILE        => '/tmp/__monitor_md5sum_hash';
use constant APACHE_LOG_PATH => '/usr/local/apache2/logs/access';
# apache
use constant APACHE_PORT        => 80;
use constant APACHE_SERVERS     => ('web1.example.com', 'web2.example.com');
# mysql
use constant MYSQL_PORT       => 3306;
use constant MYSQL_SERVERS    => ('db1.example.com', 'db2.example.com');
# memcache
use constant MEMCACHE_PORT    => 11211;
use constant MEMCACHE_SERVERS => ('cache1.example.com', 'cache2.example.com');
# search
use constant SEARCH_PORT        => 8000;
use constant SEARCH_SERVERS     => ('search1.example.com');

##############################
# Server port is alive check
##############################
sub check_server_alive {
my($server, $port) = @_;

$sock = IO::Socket::INET->new(PeerAddr=>$server, PeerPort=>$port, Proto=>'tcp', Timeout=>3);
if (!$sock){
       return 0;
}
$sock->close();
return 1;
}

##############################
# Check process is exist
##############################
sub check_process_exist {
my $proc_name = shift;
$line = `/bin/ps auxw | /bin/grep $proc_name | /bin/grep -v grep | /usr/bin/wc -l`;
$line =~ s/^s+|s+$//g;
if ($line == 0){
       return 0;
}
return 1;
}

##############################
# Check file md5 fingerprint
##############################
sub check_file_md5sum {
my $io, $line;
$filename = shift;
@arr = split(/s/, `/usr/bin/md5sum $filename`);
$filehash = shift(@arr);
$io = IO::File->new();
$io->open(MD5SUM_FILE, O_RDWR);
if (!($line = $io->getLine())){
       $io->syswrite($filehash);
       $io->close;
       return true;
}
if ($line != $filehash){
       $io->truncate(0);
       $io->syswrite($filehash);
       $io->close;
       return true;
}
return true;
}

##############################
# SMTP execute command
##############################
sub smtp_cmd {
my ($sock, $cmd, $blocking) = @_;
my %smtpinfo = SMTP_INFO;
my $buf, $bufsize = $smtpinfo{'bufsize'}, $debug=$smtpinfo{'debug'};

$sock->syswrite($cmd);
if ($debug == 1){
       print ">>> $cmd ";
}
if ($blocking == 1){
       $sock->sysread($buf, $bufsize);
       if ($debug){
         print "<<< $buf";
       }
}
}

##############################
# Send notice mail
##############################
sub send_mail {
my ($subject, $content) = @_;
my $sock;
my %mailaddr = MAIL_ADDR;
my %smtpinfo = SMTP_INFO;
my $debug = $smtpinfo{'debug'};

# Count date time
($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
$datetime = sprintf("%s-%s-%s %s:%s:%s", "20".substr($year,1,2), length($mon)==1?"0$mon":$mon, length($day)==1?"0$day":$day, length($hour)==1?"0$hour":$hour, length($min)==1?"0$min":$min, length($sec)==1?"0$sec":$sec);
$subject .= "[$datetime]";

# Connect to SMTP server
$sock = IO::Socket::INET->new(PeerAddr=>$smtpinfo{'host'}, PeerPort=>25, Proto=>'tcp', Timeout=>10);
$sock->blocking(1);

# Send smtp command
if ($debug == 1){
       print "<<< ". $sock->sysread($buf, $smtpinfo{'bufsize'});
}
smtp_cmd($sock, "HELO locahost ", 1);
smtp_cmd($sock, "AUTH LOGIN ", 1);
smtp_cmd($sock, encode_base64($smtpinfo{'user'}), 1);
smtp_cmd($sock, encode_base64($smtpinfo{'password'}), 1);
smtp_cmd($sock, "MAIL FROM: <". $mailaddr{'from'} ."> ", 1);
smtp_cmd($sock, "RCPT TO: <". $mailaddr{'to'} ."> ", 1);
smtp_cmd($sock, "DATA ", 1);
smtp_cmd($sock, "From: ". $smtpinfo{'from'} ." ", 0);
smtp_cmd($sock, "To: ". $smtpinfo{'to'} ." ", 0);
smtp_cmd($sock, "Subject: $subject ", 0);
smtp_cmd($sock, "$content ", 0);
smtp_cmd($sock, " . ", 1);
smtp_cmd($sock, "QUIT ", 0);
$sock->close();

return 1;
}

##############################
# Check server alive main
##############################
sub monitor_main {
# check apache
foreach $item (APACHE_SERVERS) {
       if (!check_server_alive($item, APACHE_PORT)) {
         send_mail("$item apache server is down", "$item apache server is down. please timely restoration");
       }
}
# check mysql
foreach $item (MYSQL_SERVERS) {
       if (!check_server_alive($item, MYSQL_PORT)) {
         send_mail("$item mysql server is down", "$item mysql server is down. please timely restoration");
       }
}
# check memcache
foreach $item (MEMCACHE_SERVERS) {
       if (!check_server_alive($item, MEMCACHE_PORT)) {
         send_mail("$item memcache server is down", "$item memcache server is down. please timely restoration");
       }
}
# check search
foreach $item (SEARCH_SERVERS) {
       if (!check_server_alive($item, SEARCH_PORT)) {
         send_mail("$item search server is down", "$item search server is down. please timely restoration");
       }
}
}

##############################
# Main running
##############################

monitor_main();

Nagios短信报警功能通过飞信实现

现在在已有邮件报警的基础上,再进行短信报警的实现,而实现短信报警是通过调用飞信来实现的,下面具体说一下安装的步骤.
1、首先保证sms这个脚本能正常运行,并且能够发送飞信。
2、在command.cfg文件中添加下面两段(手机号码为接收方的号码)
#host-notify-by-sms //发送短信报警
define command {
   command_name    host-notify-by-sms
   command_line    /usr/local/sms/duanxin.sh 138********* "Host $HOSTSTATE$ alert for $HOSTNAME$! on ‘$DATETIME$’ " $CONTACTPAGER$
   }

#service notify by sms   //发送短信报警
define command {
   command_name     service-notify-by-sms
   command_line     /usr/local/sms/duanxin.sh 138******** "’$HOSTADDRESS$’ $HOSTALIAS$/$SERVICEDESC$ is $SERVICESTATE$" $CONTACTPAGER$
   }

3、建立duanxin.sh这个脚本,这里我们将建立在/usr/local/sms下,写以下内容
(-f后面跟飞信手机号,-p是飞信密码)
/usr/local/sms/sms -f 138******** -p ****** -t $1 -m "$2"

4、要想让Nagios报警会调用sms这个脚本来发送还需要修改contacts.cfg这个文件
将主机报警和服务报警项改成command.cfg里定义的sms(不过邮件报警将不可用)

       service_notification_commands service-notify-by-sms
       host_notification_commands    host-notify-by-sms
5、还有一点要注意,就是Nagios用户必须对/usr/local/sms目录及内的文件有权限,
Chmod –R 777 /usr/local/sms

系统监控:linux命令行-飞信客户端发送免费报警短信

从 架构研究室 作者:Michael Field

一、软件环境(centos 5为例)
这里向大家推荐的是飞信机器人的软件,支持linux、命令行下的飞信、完全免费(目前为止);
官网地址:http://www.it-adv.net/
支持库安装:
需要Glibc2.4以上的版本;centos5默认安装的Glibc2.5,所不需要额外升级;
目前网上的安装文档只有ubuntu的,至于redhat、fedora、centos都没有相关安装文档,我在安装的过程中遇到很多库的问题,所以在这里一并给大家进行介绍;

二、安装过程
下载包地址 LINUX X86/32(REDHAT ES4X32):支持库 最新程序fetion20080522004-linrh4.tar.gz
其中支持库和安装包内容如下:
# tar zxvf libraryrh4x32.tar.gz
libACE-5.6.5.so
libACE_SSL-5.6.5.so
libcrypto.so.0.9.7a
libssl.so.0.9.7a

# tar zxvf fetion20080522004-linrh4.tar.gz
./install/
./install/www/
./install/www/index.html
./install/www/css/
./install/www/css/scheme.css
./install/www/css/main.css
./install/www/css/print.css
./install/www/css/main-msie.css
./install/www/images/
./install/www/js/
./install/www/js/jquery.js
./install/socket_interface/
./install/socket_interface/socket_demo.php
./install/Readme.txt
./install/sound/
./install/sound/smile8.wav
./install/sound/message.wav
./install/sound/smile1.wav
./install/sound/login.wav
./install/sound/openchatwin.wav
./install/sound/closechatwin.wav
./install/fetion
./install/plugins/
./install/plugins/plugin_contact_update
./install/plugins/plugin_buddy_application
./install/plugins/plugin_message
./install/plugins/plugin_invite
./install/plugins/plugin_timer
./install/conf/

把支持库复制到/usr/lib/目录下,并作软链接如下:
cp lib*so* /usr/lib/
ln -s /usr/lib/libcrypto.so.0.9.7a /usr/lib/libcrypto.so.4
ln -s /usr/lib/libssl.so.0.9.7a /usr/lib/libssl.so.4

设定lib库配置文件
#vi /etc/ld.so.conf
#增加一条
/usr/lib/
#保存退出后,执行
#ldconfig

fetion的目录结构:
.Readme.txt: 本说明文件
.fetion:主程序
.sound*.wav:各种音效文件,您可以用自己喜欢的文件替换
.pluginsplugin_*: 插件程序,您可以修改插件以达到自己的各性化需求

我在安装中遇到缺少krb5的库问题,这里写一下解决方法:
错误如下:
./fetion: error while loading shared libraries: libgssapi_krb5.so.2: cannot open shared object file: No such file or directory
安装一下krb5-libs包就可以解决啦:
yum install krb5-libs

完成之后测试,安装是否成功;执行
#cd install
# ./fetion -h
Usage:
fetion -h
       -h: help
fetion -u mobile -p pwd [-b batchfile] [-EN] [-d]
fetion -u mobile -p pwd [-b batchfile] [-EN] [-d]
       -u: Fetion user account(only supports mobile phone No.)
       -p: Account password
       -b: Batch file name
       -d: Debug on and write logs to [mobile]-debug.log
       -EN: English

三、实际测试
登录飞信默认是中文utf8的,如果linux系统不支持utf8会出现乱码:我使用english的方式来登录啦。
测试帐号:13713718888
密码:123456 (如果密码中含有特殊字符,请使用单引号)
./fetion -u 13713718888 -p 123456 -EN

登录后输入?获得帮助
****************************************************************
指令                    指令说明
list                   好友列表: list
sms                    发送短信: sms 飞信号/手机号/编号 短信内容(换行请用n代替)
chat                在线消息: chat 飞信号/手机号/编号 短信内容(换行请用n代替)
status                 在线状态: status online/busy/away/hidden [个性化信息]
add                    添加好友: add 飞信号/手机号 申请信息 本地呢称
del                   删除好友: del 飞信号/手机号/编号
invite                 邀请好友: invite 手机号 您的姓名(邀请好友开通飞信)
autoaccept       自动接受: autoaccept on/off/status 自动接受加为好友申请
myinfo             修改资料: myinfo nickname/impresa 内容(呢称/心情)
help                帮助菜单: help/?
exit                退出系统: quit/exit
****************************************************************

sms 137******** "this is test message" # 这个就是我们需要的发送短信的指令啦!

脚本测试:
可以使用fetion的-b参数来实现p处理;
举例如下:

# vi p.sh
sms 13712312311 “msyqlserver is down”
sms 13712312312 “db1 is not running”
sms 13712312313 “warning db2 disk3 is full”
保存后执行:
./fetion -u 13713718888 -p 123456 -b p.sh
就是一次给3个admin发出报警信息。

还有许多插件的功能,我会在下次实际应用中写出日志和大家一起研究;
在初步接触中,发现可以实现一些交互信息的查询,比如直接向短信机器人发指令得到某台服务器的运行状态等。

Nagios的布署方案

1、Nagios是一个具有很大可伸缩性的集中式系统管理工具.
3、Naigos的安装
1、 所需软件
nagios-2.0rc2.tar
nagios-plugins-1.4.tar
imagepak-base.tar.gz
2、 安装
2.1、nagios安装
tar –xvzf nagios-2.0rc2.tar
mkdir /usr/local/nagios
pw useradd nagios –d /usr/local/nagios

pw addgroup root
chmod 755 /usr/local/nagios
cd nagios-2.0rc2
./configure –prefix=/usr/local/nagios –with-gd-lib=/usr/local/lib –with-gd-inc=/usr/local/include
make all
make install       
make install-init     ##This installs the init script in /usr/local/etc/rc.d
make install-commandmode 
make install-config    ##将初始的配置文件安装到/usr/local/nagios/etc
注:在makeinstall-init这一步的时候可能会进行不下去,这时只要加个root组即可。
pw addgroup root
2.2、nagios-plugins的安装
tar –xvzf nagios-plugins-1.4.tar
mkdir /usr/local/nagios-plugins
cd nagios-plugins-1.4
./configure –prefix=/usr/local/nagios-plugins
make all
make install
安装完成以后在/usr/local/nagios-plugins会产生一个libexec的目录,将该目录全部移动到/usr/local/nagios目录下
mv /usr/local/nagios-plugins/libexec /usr/local/nagios
2.3、imagepak-base的安装
tar –xvzf imagepak-base.tar.gz
解压以后是base目录
cp –R base /usr/local/nagios/share/images/logos
2.4、安装过程全部结束
4、Nagios的设定:
1、配置apache
在apache的配置文件httpd.conf中追加
ScriptAlias /nagios/cgi-bin/ /usr/local/nagios/sbin/
<Directory "/usr/local/nagios/sbin/">
AllowOverride AuthConfig
Options ExecCGI
Order allow,deny
Allow from all
</Directory>
Alias /nagios/ /usr/local/nagios/share/
<Directory "/usr/local/nagios/share">
Options None
AllowOverride AuthConfig
Order allow,deny
Allow from all
</Directory>

2、设置访问权限
2.1、在/usr/local/nagios/share目录下
vi .htaccess
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/.htpasswd
require valid-user
2.2、在/usr/local/nagios/sbin目录下
vi .htpasswd
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/.htpasswd
require valid-user
2.3、/usr/local/apache/bin/htpasswd –c /usr/local/nagios/etc/.htpasswd nagios
这个apache目录根据安装目录的不同而不同,主要所以用.htpasswd这个命令生成用户名和密码

3、配置nagios
3.1、在/usr/local/nagios/etc下是nagios的配置模板文件.cfg-sample,把.cfg-sample文件全部拷贝成.cfg
例如:cp nagios.cfg-sample nagios.cfg
全部拷贝完成即可.
3.2、vi dependencies.cfg (在2.0没有生成这个文件,自己创建)
然后保存即可.(在1.2用一个空的文件代替原来的dependencies.cfg文件,否则会出错)
3.3、修改minimal.cfg,把里面所有定义command的全部注释掉
vi /etc/minimal.cfg
修改cgi.cfg
修改use_authentication=1为use_authentication=0,即不用验证.不然有一些页面不会显示。
3.4、然后检查配置文件是否出错
/usr/local/nagios/bin/nagios –v /usr/local/nagios/etc/nagios.cfg
出现Total Warnings: 0
Total Errors:  0
为正常
出错的话,就是.cfg文件有问题
3.5、启动后台进程 
/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
/usr/local/etc/rc.d/nagios start
3.6、http://10.4.8.81/nagios/index.html
(如果有些页面看不到的话.可以在cgi.cfg文件中
把带有authorized的选项前的#号去掉即可)

这些配置完以后,基本的nagios配置完成。
5、NRPE的安装.及监按指令的布署
nrpe 安装与使用
1、远程主机的配置(FreeBSD)
1.1、安装openssl
#./config –prefix=/usr/local/nagios/openssl
#make
#make install
1.2、安装nrpe与配置
#./configure –enable-ssl –with-ssl-lib=/usr/local/nagios/openssl/lib–with-kerberos-inc=/usr/local/nagios/openssl/include –enable-command-args
#make all
#mkdir /usr/local/nagios/etc
#mkdir /usr/local/nagios/bin
#mkdir /usr/local/nagios/libexec
#chown -R nagios:nagios /usr/local/nagios
#cp nrpe.cfg /usr/local/nagios/etc
#cp src/nrpe /usr/local/nagios/bin
#vi /usr/local/nagios/etc/nrpe.cfg
改成你允许的IP
allowed_hosts=127.0.0.1,10.0.153.57(57是nagios服务器)
改成你准备监视的服务
command[check_disk]=/usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
检查磁盘,当 / 剩余$ARG1$%报警(浅黄色),剩余$ARG2$%“出错”(红色)-p 后为指定分区

1.3、启动nrpe,端口为5666
/usr/local/nagios/bin/nrpe -c /etc/nrpe.cfg -d
1.4、安装监测的模块
nagios-plugins的安装
tar –xvzf nagios-plugins-1.4.tar
mkdir /usr/local/nagios-plugins
cd nagios-plugins-1.4
./configure –prefix=/usr/local/nagios-plugins
make all
make install
安装完成以后在/usr/local/nagios-plugins会产生一个libexec的目录,将该目录全部移动到/usr/local/nagios目录下
mv /usr/local/nagios-plugins/libexec /usr/local/nagios
2、服务器上的配置
2.1、安装openssl
#./config –prefix=/usr/local/nagios/openssl
#make
#make install
2.2、安装nrpe(主要是使用check_nrpe模块)
#./configure –enable-ssl –with-ssl-lib=/usr/local/nagios/openssl/lib –with-kerberos-inc=/usr/local/nagios/openssl/include –enable-command-args
#make all
#cp src/check_nrpe /usr/local/nagios/libexec
2.3、nagios文件的配置
vi checkcommands.cfg
定义check_nrpe命令
# ‘check_nrep’ command definition
define command{
command_name check_nrpe
command_line /usr/local/nagios/libexec/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
}
定义检查远程主机服务
vi lgweb.cfg
define service{
use               lgweb-service     ; Name of service template to use
host_name            120
service_description       disk
is_volatile           0
check_period          24×7
max_check_attempts       3 #最大重试次数
normal_check_interval      2 #正常检测时间为2分钟
retry_check_interval      1 #重试时间1分重
notification_options      w,u,c,r
notification_interval      10
notification_period       24×7
check_command         check_nrpe!check_disk!20%!10%
}

2.4、重启nagios服务
/etc/rc.d/init.d/nagios restart (linux)
/usr/local/etc/rc.d/nagios restart (freebad)
以监控一台主机(120)为例:〔注:红色为需要注意的地方〕
1.在 Nagios主机上:
root@db4 etc]#vi /usr/local/nagios//etc/lgweb.cfg
加入以代码:
#定义监测时间
define timeperiod{
timeperiod_name lgweb24x7 #名称
alias      lgweb,7 Days A Week
sunday     00:00-24:00
monday     00:00-24:00
tuesday     00:00-24:00
wednesday    00:00-24:00
thursday    00:00-24:00
friday     00:00-24:00
saturday    00:00-24:00
}
#定义联系小组及小组内成员
define contactgroup{
contactgroup_name    LDF-SYS
alias          LDF-SYS Administrators
members         lgweb ;
}
#定义联系成员
define contact{
contact_name          lgweb
alias              lg
service_notification_period   24×7
host_notification_period    24×7
service_notification_options  w,u,c,r
host_notification_options    d,u,r
service_notification_commands  notify-by-email
host_notification_commands   host-notify-by-email
email              lg@china-lg.com
}
#定义主机组及组内的主机
define hostgroup{
hostgroup_name lgwebgrou
alias      lgweb Servers
members     120 ;
}
#定义主机类型
define host{
name              lgweb-host  
notifications_enabled      1   
#可以发通告(邮件),0为关闭
active_checks_enabled      1  #主动模式打开,0为关闭 
event_handler_enabled      1   
flap_detection_enabled     1   
failure_prediction_enabled   1   
process_perf_data        1  
retain_status_information    1   
retain_nonstatus_information  1  
register            0
}
#定义服务组及组内服务名.
define servicegroup{
servicegroup_name    services
alias    Mysql Http services
members    120,LD_PING #主机名,服务
}
#定义服务类型   
define service{
name              lgweb-service
passive_checks_enabled     0   #打开被动检查模式,0为关闭
active_checks_enabled      1   #打开主动检查模式,0为关闭
parallelize_check        1  
obsess_over_service       1   
check_freshness         1   
notifications_enabled      1   #允许通告(邮件),0为关闭
event_handler_enabled      1   
flap_detection_enabled     1   
failure_prediction_enabled   1   
process_perf_data        1   
retain_status_information    1   
retain_nonstatus_information  1   
register            0   
}
以120为例
#############################################
#10.1.1.120

define host{
use           lgweb-host   #前面所定义的主机名   
host_name        120    #前面主机组内所定义的主机名
alias          DB
address         10.1.1.120
check_command      check-host-alive #
max_check_attempts   10
notification_interval  1 ;120
notification_period   24×7
notification_options  d,u,r
contact_groups     LDF-SYS #前面定义过的联系小组
}

define service{
use               lgweb-service   #前面所定义的服务名  
host_name            120
service_description       LD_PING #前面服务组内所定义的服务名
is_volatile           0
check_period          24×7
max_check_attempts       1
normal_check_interval      2
retry_check_interval      1
notification_options      w,u,c,r #通知类型
notification_interval      10;960 #通知(发送邮件)间隔的时间10分钟
notification_period       24×7 #
check_command          LD_check_ping#LD_checkcommad.cfg中定以的指令名
}
root@d etc]#vi /usr/local/nagios//etc/LD_checkcommad.cfg
加入以代码:
define command{
command_name  LD_check_ping
command_line  /usr/local/nagios/libexec/LD/LD_check.sh -H $HOSTADDRESS$ -p $ARG1$ $ARG2$
}
root@db4 etc]#cfg=” cfg_file=/usr/local/nagios//etc/lgweb.cfg”
root@db4 etc]#cfg_amd=” cfg_file=/usr/local/nagios//etc/LD_checkcommad.cfg”
root@db4 etc]# echo “$cfg” >> /usr/local/nagios/etc/nagios.cfg
root@db4 etc]# echo “$cfg_amd” >> /usr/local/nagios/etc/nagios.cfg
root@db4 etc]#/etc/init.d/nagios start