本节主要内容:

python监控一个文件或目录的变化,如果有变化,把文件上传备份至备份主机,并且还要监控上传过程是否有问题等。

根据此需求,编写如下脚本实现这个功能: 代码示例:

#!/usr/bin/env python

#coding=utf-8

#

#Status wd gs/ccs sql file changed

# site: www.#

#文件有变化上传至备份主机,上传之后验证文件是否正确

#

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()

代码说明:

此脚本中主要用到paramiko和pyinotify模块,关于paramiko的讲解可以参见:

python paramiko模块中设置执行命令超时值的方法

python模块paramiko实现上传下载与远程执行命令的代码

python paramiko模块上传本地目录到远程目录的例子

pyinotify的用法,参见官方文档:https://github.com/seb-m/pyinotify/wiki/Events-types

python监控文件或目录大小_python监控文件或目录的变化(实例代码)相关推荐

  1. python输出奇数数字序位_python对输出的奇数偶数排序实例代码

    我们从小学的时候就学习了奇数偶数,知道整数可以分成奇数和偶数两大类,能被2整除的数叫做偶数,不能被2整除的数叫做奇数.在我们python编程中,会遇到很多数字和代码,有的时候会很乱,不好操作. 在遇到 ...

  2. python 文件分割 按大小_python处理分隔大文件

    4个.sql格式的文件,2G大小,直接插入mysql数据中,文件太大了,导入不进去. 太大的文件用python处理也很麻烦,处理不了,只能先分隔成小文件处理. 文件中数据格式:其中values里面的数 ...

  3. python一个函数调用另一个函数_python下如何在目录下让Python文件去调用另一个文件内的函数或类...

    欢迎各位小哥哥小姐姐阅读本<小生>的文章,对大家学习有帮助,请点赞加关注哦!!!!!!!!!! 您的点赞和关注将是我持续更新的动力呢.^v^ 有不懂的问题可以私聊我哦! 分析 针对这个问题 ...

  4. python os.walk 指定遍历深度_python遍历文件夹,指定遍历深度与忽略目录的方法

    背景 需要在文件夹中搜索某一文件,找到后返回此文件所在目录.用最常规的os.listdir()方式实现了一版,但执行时报错:递归超过最大深度.于是自己添加了点功能,之所有写此函数是为了让它适应不同的项 ...

  5. python文件数据总和计算_python 计算文件夹里所有内容的大小总和

    计算文件夹里所有内容的大小总和 递归方法 '''计算文件夹的大小''' import os def dir_file_size(path): if os.path.isdir(path): file_ ...

  6. python对文件的操作模式_python对文件的操作

    一.python中对文件.文件夹操作时经常用到的os模块和shutil模块常用方法. 1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.返回指定目录下的所有文件 ...

  7. python下载后是黑的_python下载文件记录黑名单的实现代码

    具体代码如下所示: #!/usr/bin/python # -*- coding: GBK -*- # -*- coding: UTF-8 -*- from ftplib import FTP imp ...

  8. python读取文件的第三行_python读取文件第n行

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! pos = pos - 1 try: f.seek(pos, 2) #从文件末尾 ...

  9. python文件操作与异常处理_Python学习——文件操作和异常处理

    在上一篇文章中,我们介绍了 Python 的函数和模块,现在我们介绍 Python 中的异常和文件. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9963 ...

最新文章

  1. 复习es6-解构赋值+字符串的扩展
  2. DHH观点:为什么我偏爱Ruby?
  3. 使用Module自定义网站定义(Site Definition)
  4. 百度现场面试:JVM+算法+Redis+数据库!(三面)| CSDN博文精选
  5. 容器技术Docker K8s 14 容器服务ACK基础与进阶-容器网络管理
  6. python深度学习进阶之行为检测详细学习路线(主要实现人员的行为类别、空间定位、时间定位)
  7. centos7 分辨率修改,CentOS 7 修改屏幕分辨率
  8. abaqus14安装_Abaqus安装方法
  9. (超详细笔记整理)动力节点_老杜 | JavaSE进阶 【P486之后】
  10. 计算机上显示找不到无线网络连接,电脑怎么找不到无线网络? 笔记本找不到无线网络如何解决?...
  11. 红米手机4X获得Root权限的流程
  12. WINDOWS操作系统发展历程
  13. HTML5三屏合一的架构设计
  14. Ol4中晕圈点效果的实现
  15. 计算机辐射测试,无线路由器辐射测试方法
  16. 我的软件之自动更新程序
  17. 『2月特刊』伟大的朋友丨拿破仑(1)
  18. 昂首阔步迈入大数据时代
  19. 肺活量测试软件原理,测测你的肺活量 肺活量测试装置小发明小实验
  20. html之如何让button按钮居中

热门文章

  1. 我喜欢的郭敬明的文字
  2. 2017计算机研究生专业排名,2017年USNews美国大学计算机硕士研究生专业排名TOP110...
  3. mysql log-slave-update_mysql数据库log-slave-updates 参数解释
  4. 公网访问本地内网web服务器【内网穿透】
  5. 关于java读写文件
  6. 移动联通电信2G3G4G网络速度——无线蜂窝技术:CDMA2000、1x/EVDo、GSM、EDGE、TD-SCDMA、HSPA、WCDMA、HSPA、TD-LTE 速度
  7. 构建自己的gym训练环境
  8. 淘宝+Selenium
  9. []int16转[]byte
  10. 熬夜怒肝,保姆级Python学习路线,起飞!