jy166102 发表于 2018-8-28 13:46:07

第 三 十 三 天:shell 编 程 之 监 控 脚 本

  小Q:如果你浪费了自己的年龄,那是挺可悲的。因为你的青春只能持续一点儿
  时间——很短的一点儿时间。                        —— 王尔德
  ======================================================================
  在工作中,一些安装程序的脚本可以实现自动化,大大方便我们;但更重要的是我们得先
  保证我们服务器运转正常,有些需要的监控服务也许第三方没有给出来,或者我们需要监
  控一些特别的服务,所以自己写监控脚本是必须掌握的;
  对于个人来说:我较喜欢nagios的添加服务方式和zabbix的监控界面和操作;
  简单举例他俩添加自定义监控脚本的方式,让我们了解这过程。
  附加一篇mysql数据备份脚本。
  ---------------------------------自定义nagios监控脚本-----------------
  条件:两台服务器.安装nagios,和一些前期的配置,具体操作见下:
  http://beibing.blog.51cto.com/10693373/1702654
  需求:我们磁盘有很多分区,我们需要时常查看他的使用量,当他块被写满的时候,需要
  清理一下,但我们不想天天输命令查看,实现他快满的时候,在监控中提示我们;
  扩展:快要满的时候给我们发邮件提醒;
  client端:192.168.0.12
  vim /etc/nagios/nrpe.cfg
  allowed_hosts=127.0.0.1 改为 allowed_hosts=127.0.0.1,192.168.0.11
  dont_blame_nrpe=0 改为 dont_blame_nrpe=1
  vim/usr/local/nagios/libexec/check_disk.sh   #脚本存放的位置
#!/bin/bash  

  
row=`df -h |wc -l`                                    #定义系统分区的每行内容
  
for i in `seq 2 $row`                                 #从第二行开始到最后一行
  
do
  
      ava=`df -h |sed -n "$i"p|awk '{print $4}'`    #检索每一行并打印出第四列空余量
  
      u_per=`df -h |sed -n "$i"p|sed -n "s/\%//"p|awk '{print $5}'`#输出使用量
  
      p_p=`df -h -P|sed -n "$i"p|awk '{print $6}'`#输出分区挂载位置
  
      if [ "$u_per" -gt "97"];then                #判断使用量大于97%
  
                echo -n "$p_p CRITICAL $u_per% $ava " #输出critcal危急和三个变量
  
                sta[$i]=2                           #以2表示
  
      elif [ "$u_per" -gt "95" ];then
  
                echo -n "$p_p WARNING! $u_per% $ava"#使用量大于95%,warning用1表示
  
                sta[$i]=1
  
      else                                          #echo -n 代表不换行
  
                echo -n "$p_p OK $u_per% $ava"
  
                sta[$i]=0                           #否则输出ok,以0表示
  
      fi
  
done
  
n=0
  
for j in `seq 2 $row`
  
do
  
      if [ "${sta[$j]}" -gt $n];then             #j对应i,sta[$j]先与0进行比较
  
                n=${sta[$j]}                         #将较大使用量分区代表值赋予n
  
      fi
  
done
  
exit $n                      #以最大值结束;
  修改权限:chmod +x/usr/lib/nagios/plugins/check_disk.sh
  vim/etc/nagios/nrpe.cfg                     #服务端调用文件中的check_disk
  command=/usr/lib/nagios/plugins/check_disk.sh
  重启:/etc/init.d/nrpe restart
  service端:192.168.0.11
  检 测 : check_nrpe -H 192.168.0.12 -c check_disk
  正常的话,会输出一行磁盘检测的数据;否则需要去排错了
  添加服务:vim/etc/nagios/conf.d/192.168.0.12.cfg
define host{  
      use                     linux-server
  
      host_name               192.168.0.12            #监控客户端IP
  
      alias                   0.12
  
      address               192.168.0.12
  
      }
  
define service{
  
      use                  generic-service
  
      host_name            192.168.0.12
  
      service_description    check_disk               #设置的命令
  
      check_command          check_nrpe!check_disk    #调用命令的路径
  
      max_check_attempts 5
  
      normal_check_interval 1
  
}
  vim /etc/nagios/objects/commands.cfg
define command{                     #定义上边的check_nrpe,否则上边的nrpe识别不到命令  
      command_name    check_nrpe
  
      command_line    $USER1$/check_nrpe -H $HOSTADDRESS$ -c $ARG1$
  
      }
  检测:nagios -v /etc/nagios/nagios.cfg
  重启:/etc/init.d/nagios restart(客户service nrpe restart 服务service nagios restart)
  当然了,http或者nginx也都要重启一个,否则根本连接不上啊;然后就可以登陆nagios
  网站进行监控了,192.168.0.11/nagios查看;
  自定义监控脚本方式大同小异,写好脚本,顺着这种方式套,应该没问题;而关于扩展的
  问题,去参考上面给的衔接,理解之后就知道怎么调用了;
  -----------------------自定义zabbix监控脚本------------------
  条件:仍旧是前期的一些准备安装啦.连接了....去看看下面的文章吧
  http://beibing.blog.51cto.com/10693373/1702665
  需求:带三方软件没有提供监控网卡平均流量,我们需要去做一个网卡的实时监控,输出
  进网卡和出网卡的平均字节数;
  扩展:实现多个网卡的进出数据包的选择
  Client:
  安装完成---各种服务开启----配置通信----检测成功----浏览器正常使用后----继续
  vim   /etc/zabbix/zabbix_agentd.conf
  改动:UnsafeUserParameters=1
  UserParameter=my.net.if
[*](英文方括号)/usr/local/sbin/zabbix/net.sh $1 $2
  UserParameter用来自定义键值,即我们要在监控软件添加用的key;因为我们写的
  脚本有参数表达,所以加了
[*]和$1 $2,否则是不需要的
  vim/usr/local/sbin/zabbix/net.sh           #编写的脚本
#!/bin/bash         #其实还可以选择哪个网卡,思路$1等于数字,将每个进出模块放到网卡模块  

  
eth=$1            #将被调用的$1参数,其实可以写eth1,只不过下面没定义
  
io=$2               #网卡进出(数据包的)的参数选择in/out,$2调用
  
net_file="/proc/net/dev"                      #网卡流量的存储文件
  
if [ $2 == "in" ]                           #进的数据包
  
then
  
    n_new=`grep "$eth" $net_file|awk '{print $2}'` #检索打印文件中的第二行
  
    n_old=`tail -1 /tmp/neti.log`                  #查看文件重最后一行,临时文件
  
    n=`echo "$n_new-$n_old"|bc`                  #取最新和上一次的差值
  
    d_new=`date +%s`                               #记录时间戳,也要记录到临时文件
  
    d_old=`tail -2 /tmp/neti.log|head -1`          #查看上一次的时间戳
  
    d=`echo "$d_new-$d_old"|bc`                  #取时间差值,bc实现高精度计算
  
    if_net=`echo "$n/$d"|bc`                     #最终输出结构流量差值除时间差值
  
    echo $if_net
  
    date +%s>>/tmp/neti.log                        #时间戳记录到临时文件
  
    grep "$eth" $net_file|awk '{print $2}'>>/tmp/neti.log #网卡第二行记录到临时文件
  
elif [ $2 == "out" ]
  
then
  
    n_new=`grep "$eth" $net_file|awk '{print $10}'` #和上面一样,只是记录的出网卡的字节
  
    n_old=`tail -1 /tmp/neto.log`
  
    n=`echo "$n_new-$n_old"|bc`
  
    d_new=`date +%s`
  
    d_old=`tail -2 /tmp/neto.log|head -1`
  
    d=`echo "$d_new-$d_old"|bc`
  
    if_net=`echo "$n/$d"|bc`
  
    echo $if_net
  
    date +%s>>/tmp/neto.log
  
    grep "$eth" $net_file|awk '{print $10}'>>/tmp/neto.log
  
else
  
    echo 0
  
fi
  在脚本执行前,需要先做一个操作,搭建临时文件,给个数值:
  touch /tmp/net.log
  date +%s >>/tmp/neti.log
  grep eth0 /proc/net/dev |awk '{print $2}' >>/tmp/neti.log
  date +%s >>/tmp/neto.log
  grep eth0 /proc/net/dev |awk '{print $10}' >>/tmp/neto.log
  chown zabbix/tmp/net.log
  service端:
  检测:zabbix_get -s 192.168.0.12 -p10050 -k "my.net.if"
  返回一个数值的话就说明没问题;
  没问题就可以进监控界面添加服务了,浏览器:192.168.0.11/zabbix
  组态 --> 主机 --> 项目--> 创建监控项
  名称 “网卡流量出”                #自定义
  类型默认“zabbix代理”
  键值"my.net.if"/my.net.if
  数据更新间隔60
  存档                               #此时就可以进行监控了,可以看到折线图出现
  -------------------------------------mysql数据备份--------------------
  1. 最简单的
#!/bin/bash                ##进入数据库将mylinux备份到日期命名的文件  
d=`date +%w`               #dateweek
  
/usr/bin/mysqldump -umylinux -pxxxxx mylinux >/data/mysqlbak/$d.sql
  2. 稍微复杂的
#! /bin/bash  
STORE_NAME=`date +%m%d`                      #几月几号
  
STORE_NAME2=`date +%w`                     #周几
  
STORE_DIR='/backup/mysqlbak'               #
  
REMOTE_DIR='ypl-web:/backup'
  
BACKUP_DIR='/data/mysql/'
  
exec 1>/var/log/mysqlbak.log 2>&1
  
echo mysqlbak start `date`
  
/etc/init.d/mysqld stop                     #停止服务
  
sleep 2
  
killall -9 mysqld; sleep 2                  #杀死进程
  
killall -9 mysqld
  
/usr/bin/rsync -azu $BACKUP_DIR $STORE_DIR/$STORE_NAME2   #推送文件到STORE_DIR
  
/etc/init.d/mysqld start                                  #开启服务
  
for db in ypl 1yplcc ypl913 ecshop wordpress
  
do
  
    /usr/local/mysql/bin/mysqldump-uroot -p'xxx' $db >$STORE_DIR/$db-$STORE_NAME.sql
  
echo mysqlbak end `date`            #将以上文件内容添加到该用户,并以时间命名的文件中
  
cd $STORE_DIR
  
for db in ypl 1yplcc ypl913 ecshop wordpress
  
do
  
    gzip   -f$db-$STORE_NAME.sql                     #压缩这几个文件
  
done
  
find $STORE_DIR/*.sql.gz-mtime +6 |xargs rm -f       #搜索六分钟前的压缩包删除
  
echo remote bak start `date`                           #输出 字符组 和时间
  
/usr/bin/rsync -azu --delete $STORE_DIR $REMOTE_DIR/   #
  
echo remote bak end `date`
  3. innodb引擎,超大数据库备份
#!/bin/bash  
## mysql backup daily 3306 and 3307.##理解不了
  

  
exec 2> /BACKUP/mysqlbackup/bak.err
  
innb="/usr/bin/innobackupex"
  
opt="--user=backup \
  
   --password=bakBAK001 \
  
   --defaults-file=/etc/my.cnf "
  
bakdir="/BACKUP/mysqlbackup/whole"
  
bak() {
  
    $innb $opt --socket=$1 $bakdir/$2
  
}
  
bak /tmp/mysql1.sock 3306 >/tmp/3306.bak
  
bak /tmp/mysql2.sock 3307 >/tmp/3307.bak
  
find /BACKUP/mysqlbackup/whole/ -type f -mtime +7 |xargs rm -f
  执行脚本:


页: [1]
查看完整版本: 第 三 十 三 天:shell 编 程 之 监 控 脚 本