分享Linux监控报警文件修改的解决方案。大致情况是生产用的系统,想做一个文件修改邮件报警,但不知道如何写脚本,大致想法是如果文件一被修改,即发送一封邮件到指定的邮箱。
基本需求是需要监控"/root/global.cfg"这个文件,如果一旦发现文件更改,就发送一份邮件给我手机的139邮箱,然后手机上面就会收到相应的短信提示。我用到的解决办法是:
第一个脚本:使用"inotifywait“实时监控这个文件的修改,如果一旦发现文件变动,就将结果追加写入到"/backup/tmp.txt” 这个文件中。
#!/bin/bash
/usr/local/bin/inotifywait --timefmt '%Y%m%d%H%M%S' --format '%T,%w%f,%e' -mrqe modify,attrib,move,close_write,create,delete,delete_self /root/global.cfg >> /backup/tmp.txt
复制代码
第二个脚本:使用md5sum工具实时监控"/backup/tmp.txt” 这个文件,如果一旦发现文件MD5值变动,即调用第三个脚本,自动发信给139邮箱,同时还会更新"/backup/tmp.txt” 这个文件的MD5值。
#!/bin/bash
while true
do
old=`/bin/cat /backup/md5.db | awk '{print $1}'`
new=`/usr/bin/md5sum /backup/tmp.txt | awk '{print $1}'`
if [ "$old" != "$new" ]
then
/backup/sendmail.py >& /dev/null
echo "$new" > /backup/md5.db
fi
sleep 1
done
复制代码
第三个脚本:发送邮件的脚本。
#!/usr/bin/python
# -*- coding: utf-8 -*-
from email.MIMEText import MIMEText
import smtplib
#邮箱参数配置
mail_host="smtp.163.com"
mail_user="######"
mail_pass="######"
mail_postfix="163.com"
def send_mail(to_list,sub,content):
me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
msg = MIMEText(content)
msg['Subject'] = sub
msg['From'] = me
msg['To'] = ";".join(to_list)
try:
s = smtplib.SMTP()
s.connect(mail_host)
s.login(mail_user,mail_pass)
s.sendmail(me, to_list, msg.as_string())
s.close()
return True
except Exception, e:
print str(e)
return False
if __name__ == '__main__':
mailto_list=["13476######@139.com"]
if send_mail(mailto_list,"Maybe the system failovered ,please check immediately !"):
print "successed!"
else:
print "failed!"
复制代码
最后再将前面两个脚本写入到开机脚本“/etc/rc.d/rc.local”文件中。
目前这几个脚本基本能实现我所需要的功能,但是写脚本的确不是小弟的强项,很多东西是根据网上的内容拼凑起来的。
所以我的问题是,有没有高手能够指点下这几个脚本怎么优化下,并且这样写对服务器会不会有其他的什么影响。