免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: pp12416
打印 上一主题 下一主题

Linux如何监控报警文件修改 --已经找到解决办法,求高手指点。 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2012-02-09 16:11 |只看该作者
本帖最后由 pp12416 于 2012-02-09 16:33 编辑

得前面几位兄弟的提示,小弟查了些资料,搞出了下面的几个脚本,基本能实现需求,但写脚本我确实不在行,贴出来求高手指点为谢。

基本需求是需要监控"/root/global.cfg"这个文件,如果一旦发现文件更改,就发送一份邮件给我手机的139邮箱,然后手机上面就会收到相应的短信提示。我用到的解决办法是:

第一个脚本:使用"inotifywait“实时监控这个文件的修改,如果一旦发现文件变动,就将结果追加写入到"/backup/tmp.txt” 这个文件中。

  1. #!/bin/bash
  2. /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值。
  1. #!/bin/bash
  2. while true
  3. do
  4. old=`/bin/cat /backup/md5.db | awk '{print $1}'`
  5. new=`/usr/bin/md5sum /backup/tmp.txt | awk '{print $1}'`
  6.         if [ "$old" != "$new" ]
  7.                 then
  8.                         /backup/sendmail.py >& /dev/null
  9.                         echo "$new" > /backup/md5.db
  10.         fi
  11.         sleep 1
  12. done
复制代码
第三个脚本:发送邮件的脚本。
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. from email.MIMEText import MIMEText
  4. import smtplib
  5. #邮箱参数配置
  6. mail_host="smtp.163.com"
  7. mail_user="######"
  8. mail_pass="######"
  9. mail_postfix="163.com"

  10. def send_mail(to_list,sub,content):
  11.         me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
  12.         msg = MIMEText(content)
  13.         msg['Subject'] = sub
  14.         msg['From'] = me
  15.         msg['To'] = ";".join(to_list)
  16.         try:
  17.                 s = smtplib.SMTP()
  18.                 s.connect(mail_host)
  19.                 s.login(mail_user,mail_pass)
  20.                 s.sendmail(me, to_list, msg.as_string())
  21.                 s.close()
  22.                 return True
  23.         except Exception, e:
  24.                 print str(e)
  25.                 return False
  26. if __name__ == '__main__':
  27.         mailto_list=["13476######@139.com"]   
  28.         if send_mail(mailto_list,"Maybe the system failovered ,please check immediately !"):
  29.                 print "successed!"
  30.         else:
  31.                 print "failed!"
  32.   
复制代码
最后再将前面两个脚本写入到开机脚本“/etc/rc.d/rc.local”文件中。

目前这几个脚本基本能实现我所需要的功能,但是写脚本的确不是小弟的强项,很多东西是根据网上的内容拼凑起来的。
所以我的问题是,有没有高手能够指点下这几个脚本怎么优化下,并且这样写对服务器会不会有其他的什么影响。

再次感谢楼上所有兄弟的指点。

论坛徽章:
0
12 [报告]
发表于 2012-02-16 17:36 |只看该作者
我不是高手,测试了一下,不用3个脚本,两个就够了,如下,执行/bin/bash /home/sh/check_change.sh &,(执行后会出现两个进程,但不影响使用,不知道为什么,还请高人指点一下)注意脚本的路径,这个在centos6.0,python2.6.5测试通过,python2.4.3测试会出现如下报错
Traceback (most recent call last):
  File "./mail.py", line 4, in ?
    from email.mime.text import MIMEText
ImportError: No module named mime.text

第一个
#!/bin/bash
src=/root/global.cfg
DR_MAIL=/home/sh
/usr/local/inotify-tools/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e modify,delete,create,attrib $src | while read files
do
/usr/bin/python $DR_MAIL/mail.py
echo "${files} was changed" >>/home/change.log 2>&1
done

第二个mail.py
#!/usr/bin/env python
# -*- coding: gbk -*-
import smtplib
from email.mime.text import MIMEText
#############你要发到的邮箱地址
mailto_list=["13476######@139.com"]   
#####################
mail_host="smtp.163.com"
mail_user="xxx"
mail_pass="xxxx"
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__':
    if send_mail(mailto_list,"changed","the file has been changd,please check it now!"):
        print "ok"
    else:
        print "faild"

论坛徽章:
4
戌狗
日期:2014-10-12 21:48:202015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2015-06-09 22:20:002016猴年福章徽章
日期:2016-02-18 15:30:34
13 [报告]
发表于 2012-02-16 20:48 |只看该作者
发邮件用 mutts + msmtp可以用163新浪邮箱发邮件 不用本身的sendmail

论坛徽章:
0
14 [报告]
发表于 2012-02-16 22:00 |只看该作者
qkyz1983 发表于 2012-02-16 17:36
我不是高手,测试了一下,不用3个脚本,两个就够了,如下,执行/bin/bash /home/sh/check_change.sh &,(执 ...



"qkyz1983" 兄比我厉害多了,我就只会按照网上的方法生搬硬套,你的方法确实没错,我都没想到可以直接用while循环直接调用邮件脚本,还去用什么MD5SUM,汗。

谢谢"qkyz1983”了。

论坛徽章:
0
15 [报告]
发表于 2012-02-17 16:09 |只看该作者
inotify就行

论坛徽章:
0
16 [报告]
发表于 2012-02-23 10:36 |只看该作者
用飞信机器人吧,直接给手机发短信

论坛徽章:
0
17 [报告]
发表于 2012-09-25 10:26 |只看该作者
本帖最后由 yyp8008 于 2012-09-25 10:28 编辑

回复 11# pp12416


    这个效果有点不好啊,我测试了一下,/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d%m%y %H:%M' --format '%T%w%f' -e modify,delete,move,create,attrib /shell >> /shell/test.txt  产生的文件有34M,还是只检测了一个目录,如果检测整过系统,那不是更大,会不会造成系统压力很大呢,我连续添加了几个文件到shell目录最后test.txt文件就增大到385M,这个变化很吓人啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP