python监控文件或目录变化
作者:@dongxiaojie 发布时间:2023-09-05 16:08:28
标签:python,监控文件,目录变化
本文实例实现的功能是监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且要监控上传过程是否有问题等,具体内容如下
#!/usr/bin/env python
#coding=utf-8
#
#Status wd gs/ccs sql file changed
#文件有变化上传至备份主机,上传之后验证文件是否正确
#
import paramiko,os,sys,datetime,time,MySQLdb
from pyinotify import WatchManager, Notifier, ProcessEvent, IN_DELETE, IN_CREATE,IN_MODIFY
'''
CREATE TABLE `wddel_log.status_sql` (
`ip` varchar(16) NOT NULL COMMENT '机器IP',
`tar_name` varchar(50) NOT NULL COMMENT '备份文件名字',
`md5` varchar(50) NOT NULL COMMENT '备份文件MD5',
`flag` int(2) NOT NULL COMMENT '0:成功;1:失败',
`error_log` varchar(100) NOT NULL COMMENT '错误日志',
`uptime` datetime NOT NULL COMMENT '更新时间',
KEY `ip` (`ip`),
KEY `uptime` (`uptime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8'''#日志表创建脚本
GM_path='/home/asktao/'
center_hostname='192.168.1.100'
center_username='root'
center_password='123456'
center_port=63008
def log2db(ip,tar_name,md5,flag,error='0'):#删除日志入库
try:
tar_name = os.path.split(tar_name)[1]
now = time.strftime("%Y-%m-%d %H:%M:%S")
conn = MySQLdb.connect(host = '192.168.1.104',user = 'root',passwd = '1q2w3e4r',charset='utf8',connect_timeout=20)
cursor = conn.cursor()
sql = "SELECT ip FROM wddel_log.status_sql WHERE ip='%s'" % ip
cursor.execute(sql)
res = cursor.fetchall()
if len(res)==0:
inster_sql = "insert into wddel_log.status_sql VALUES('%s','%s','%s',%s,'%s','%s')" % (ip,tar_name,md5,flag,error,now)
cursor.execute(inster_sql)
conn.commit()
else:
update_sql = "UPDATE wddel_log.status_sql SET md5='%s',flag='%s',error_log='%s',uptime='%s' WHERE ip='%s'" % (md5,flag,error,now,ip)
cursor.execute(update_sql)
conn.commit()
cursor.close()
conn.close()
except Exception,e:
print e
def find_ip():#获取本地eth0的IP地址
ip = os.popen("/sbin/ip a|grep 'global eth0'").readlines()[0].split()[1].split("/")[0]
if "192.168." in ip:
ip = os.popen("/sbin/ip a|grep 'global eth1'").readlines()[0].split()[1].split("/")[0]
return ip
def md5sum(file_name):#验证sql打包文件的MD5
if os.path.isfile(file_name):
f = open(file_name,'rb')
py_ver = sys.version[:3]
if py_ver == "2.4":
import md5 as hashlib
else:
import hashlib
md5 = hashlib.md5(f.read()).hexdigest()
f.close()
return md5
else:
return 0
def center_md5(file_name):#上传至备份中心的文件的MD5
try:
s=paramiko.SSHClient()
s.set_missing_host_key_policy(paramiko.AutoAddPolicy())
s.connect(hostname = center_hostname,port=center_port,username=center_username, password=center_password)
conm = "/usr/bin/md5sum %s" % file_name
stdin,stdout,stderr=s.exec_command(conm)
result = stdout.readlines()[0].split()[0].strip()
s.close()
return result
except Exception,e:
return e
def back_file(ip,tar_name,tar_md5):#上传文件到备份中心
remote_dir='/data/sql'
file_name=os.path.join(remote_dir,os.path.split(tar_name)[1])
try:
t=paramiko.Transport((center_hostname,center_port))
t.connect(username=center_username,password=center_password)
sftp=paramiko.SFTPClient.from_transport(t)
sftp.put(tar_name,file_name)
t.close()
#print "%s back_file OK" % tar_name
os.remove(tar_name)
remot_md5=center_md5(file_name)
if remot_md5 == tar_md5:
log2db(ip,tar_name,tar_md5,0)
else:
log2db(ip,tar_name,tar_md5,1,'remot_md5!=tar_md5')
except Exception,e:
#print "connect error!"
log2db(ip,tar_name,tar_md5,1,e)
os.remove(tar_name)
def back_sql():#执行备份
ip = find_ip()
tar_name = "/tmp/%s.tar.gz" % ip
sql_conn = "/usr/bin/find %s -type f -name '*.sql'|/usr/bin/xargs /bin/tar zcvPf %s" % (GM_path,tar_name)
sql_tar = os.popen(sql_conn).readlines()
tar_md5 = md5sum(tar_name)
if tar_md5 != 0:
back_file(ip,tar_name,tar_md5)
else:
error_log = "%s not find" % tar_name
log2db(ip,tar_name,tar_md5,0,error_log)
class PFilePath(ProcessEvent):#文件变化的触发
def process_IN_CREATE(self, event):
if os.path.splitext(event.name)[1] == ".sql":
text = "Create file: %s " % os.path.join(event.path, event.name)
#print text
back_sql()
def process_IN_MODIFY(self, event):
if os.path.splitext(event.name)[1] == ".sql":
text = "Modify file: %s " % os.path.join(event.path, event.name)
#print text
back_sql()
def FSMonitor():#主监控函数
back_sql()#运行脚本先备份sql文件
wm = WatchManager()
mask = IN_CREATE |IN_MODIFY
notifier = Notifier(wm, PFilePath())
wdd = wm.add_watch(GM_path, mask, rec=True)
print 'now starting monitor %s' % (GM_path)
while True:
try :
notifier.process_events()
if notifier.check_events():
notifier.read_events()
except KeyboardInterrupt:
notifier.stop()
break
if __name__ == "__main__":
FSMonitor()
0
投稿
猜你喜欢
- 本篇文章主要介绍Java操作MongoDB。开发环境:System:WindowsIDE:eclipse、MyEclipse 8Databa
- 本文实例讲述了Python Django框架url反向解析实现动态生成对应的url链接。分享给大家供大家参考,具体如下:url反向解析:根据
- 在我前一阵子刚刚写了“HTML5与Flash,不得不说的话题”的评论后,如各位所料,由于牵扯到多方利益和未来标准制定的角色份量,这不,有可能
- 前言HTML 5如同一场革命,正在Web2.0后时代轰轰烈烈的进行着。HTML 5是什么,无须我在这里赘述了。对于HTML 5的革新,按我的
- 本文实例讲述了Symfony模板的快捷变量用法。分享给大家供大家参考,具体如下:在模板里,有一些symfony变量可以直接使用。通过这些快捷
- 在官网下载源码包:https://www.php.net/downloads.php步骤:1、解压命令:tar -xjvf php.tar.
- css usage是一个基于firebug的firefox扩展,可以用来查看页面中的CSS的使用情况,可以清楚的查看css文件中所有的规则在
- 根据国务院文件,5.19-5.21为全国哀悼日,在此期间,全国和各驻外机构下半旗志哀,停止公共娱乐活动,外交部和我国驻外使领馆设立吊唁簿。5
- 本文实例为大家分享了js实现QQ邮箱邮件拖拽删除的具体代码,供大家参考,具体内容如下步骤分析:根据数据结构生成HTML结构全选和单选功能的实
- 1. 横排往下会影响阅读速度。如12345678的单排单列数字,肯定是竖排阅读快。但多行多列的整块信息,横排并不见得就比竖排慢,比如所有简体
- 最近心情非常差,而且还没有触底的样子,哎~~~总是会忍不住叹气~~~前些日子在Twitter上叨唠说“不在乎IE8什么时候推出,只在乎IE6
- 实际开发过程中,我们经常会被各种宽度,高度计算搞晕。尤其是使用了rem的计算方式,自适应布局难倒一大片程序员。为了解决这类问题,我觉得可以利
- 1. php 中的序列化在 PHP 中,序列化是将数据结构或对象转换为可以存储或传输的字符串表示的过程,经过序列化之后的对象或者数据结构,就
- 从小的方面讲,帮助一般是指:手册、说明书、文档、FAQ 等等。从大的方面讲,可以是交互过程中的提示、指引、演示等信息,帮助无处不在!这一切,
- 本文主要介绍了Python 字典值查询出对应的键,分享给大家,也给自己留个笔记,具体如下:# -*- coding: utf-8 -*-#
- 经常看到有新手问PHP有没有类似asp的left函数或right函数,实现截取某字符串左边或右边开始N个字符的函数。答案当然是有的。PHP中
- 这样处理的弊端是:如果数据量大,子分类很多,达到4级以上,这方法处理极端占用数据库连接池 对性能影响很大。 如果用SQL下面的CTE递归处理
- 一.错误分类1. 语法错误也称为解析错误,发生在传统编程语言的编译时,在JavaScript中发生在解释时,这些错误是由代码中的意外字符直接
- 24小时内记录(即86400秒)$sql="Select video_id,count(id)as n FROM `rec_dow
- 一、节点的定义dom节点树图中可见节点HTML文档中的每个成分都是一个节点:整个文档是一个文档节点每个HTML标签是一个元素节点包含在HTM