|
小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
执行脚本:
|
|
|