设为首页 收藏本站
查看: 1104|回复: 0

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

[复制链接]

尚未签到

发表于 2018-8-28 13:46:07 | 显示全部楼层 |阅读模式
  小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[check_disk]=/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[io].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[io].log
      service端:
      检测:zabbix_get -s 192.168.0.12 -p10050 -k "my.net.if[eth0,out]"
      返回一个数值的话就说明没问题;
      没问题就可以进监控界面添加服务了,浏览器:192.168.0.11/zabbix
      组态 --> 主机 --> 项目  --> 创建监控项
      名称 “网卡流量出”                #自定义
      类型默认“zabbix代理”
      键值  "my.net.if[eth0,out]"  /  my.net.if[eth0,in]
      数据更新间隔  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557810-1-1.html 上篇帖子: 第 三 十 三 天:shell编程之一键安装LAMP/LNMP 下篇帖子: bash shell之数组使用
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表