Linux下文件夹的自动同步
Linux下文件夹的自动同步
问题:服务器a每天21:00给服务器B发送日志文件,服务器B接受到日志文件后,如果磁盘大小小于10G则选择创建时间最早的文件删除,保证磁盘剩余空间大于等于10G。
安装的python库
#coding=utf-8
import time
import os
import threading
import socket
import schedule
import hashlib
import shutil
from functools import cmp_to_key
#coding=utf-8在Linux系统中用来指定编码方式,否则程序中有中文会报错!
path_str = ‘./home1’ ##工作目录
ip = ‘127.0.0.1’
port = 6969
指定工作目录,目标IP,端口号等信息。
对文件夹下文件进行排序,按照时间排序
def compare(x,y): ##文件夹排序函数--sort()stat_x = os.stat(path_str + '/' + x)stat_y = os.stat(path_str + '/' + y)if stat_x.st_ctime < stat_y.st_ctime:return -1elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一return 1else:return 0
定义多线程函数
def run_threaded(job_func): ##多线程并发执行job_thread = threading.Thread(target=job_func)job_thread.start()
监听,每天定时执行,A和B错开一分钟确保不会掉线
#服务器Bschedule.every().day.at("21:01").do(run_threaded,start)while True:schedule.run_pending()time.sleep(1)
#服务器Aif not os.path.exists(path_str):os.mkdir(path_str)schedule.every().day.at("21:00").do(run_threaded,Serber_start)schedule.every().day.at("21:00").do(run_threaded,storage_space)while True:schedule.run_pending()time.sleep(1)
创建收发信息的日志文件
def journal(record):if os.path.exists('./abc.log'):with open('./abc.log','a') as f:f.write(record)else:with open('./abc.log','w+') as f:f.write(record)
监视磁盘空间,小于指定值则删除最早创建的文件
def storage_space(): ##监视磁盘空间,当磁盘空间少于10时,删除最先创建的文件夹global path_strdisk = os.statvfs(path_str)disk_size = disk.f_bsize * disk.f_blocks / (1024 ** 3) # 1G = 1024M 1M = 1024KB 1KB = 1024bytesdisk_used = disk.f_bsize * (disk.f_blocks - disk.f_bfree) / (1024 ** 3)count = time.time()while True:if time.time() - count > 600:breakiterms = os.listdir(path_str)iterms.sort(key=cmp_to_key(compare)) ##对文件夹的创建时间排序if disk_size-disk_used < 10:time.sleep(10)shutil.rmtree(path_str + '/' + iterms[0])journal('delete ' + iterms[0] + time.strftime(" %Y-%m-%d %H:%M:%S\n", time.localtime()))time.sleep(1)
服务器B完整代码
#coding=utf-8
import time
import os
import threading
import socket
import schedule
import hashlib
import shutil
from functools import cmp_to_key
path_str = './home1' ##工作目录
ip = '127.0.0.1'
port = 6969
def journal(record):if os.path.exists('./abc.log'):with open('./abc.log','a') as f:f.write(record)else:with open('./abc.log','w+') as f:f.write(record)
def server_bind():global ipglobal portserver = socket.socket()server.bind((ip,port))server.listen(5)if os.path.exists(path_str + '/{}'.format(time.strftime('%Y-%m-%d'))):shutil.rmtree(path_str + '/{}'.format(time.strftime('%Y-%m-%d')))os.mkdir(path_str + '/{}'.format(time.strftime('%Y-%m-%d'))) ##创建日期文件夹flag = Truecount = 0count_1 = -1while True:if count_1 == count:breakconn, addr = server.accept()if flag:count_1 = int(conn.recv(1024).decode('utf-8'))flag = Falseconn.close()continueSerber_start(conn)count += 1
def Serber_start(conn): ##接受数据## os.makedirs('./{}'.format(time.strftime('%Y-%m-%d'))) ##创建日期文件夹filename,filesize= conn.recv(1024).decode('utf-8').split(':')filesize=int(filesize)received_size = 0with open(path_str + '/{}/{}'.format(time.strftime('%Y-%m-%d'), filename), 'wb') as f:m = hashlib.md5()while received_size < filesize:size = 0 ##准确接受的数据包大小if filesize - received_size > 1024:size = 1024else:size = filesize - received_sizedata=conn.recv(size)received_size += len(data)m.update(data)f.write(data)md5_server = conn.recv(1024)md5_client = m.hexdigest()if md5_server != md5_client:journal(filename + ':' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '-md5校验失败\n')
def compare(x,y): ##文件夹排序函数--sort()stat_x = os.stat(path_str + '/' + x)stat_y = os.stat(path_str + '/' + y)if stat_x.st_ctime < stat_y.st_ctime:return -1elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一return 1else:return 0
def storage_space(): ##监视磁盘空间,当磁盘空间少于10时,删除最先创建的文件夹global path_strdisk = os.statvfs(path_str)disk_size = disk.f_bsize * disk.f_blocks / (1024 ** 3) # 1G = 1024M 1M = 1024KB 1KB = 1024bytesdisk_used = disk.f_bsize * (disk.f_blocks - disk.f_bfree) / (1024 ** 3)count = time.time()while True:if time.time() - count > 600:breakiterms = os.listdir(path_str)iterms.sort(key=cmp_to_key(compare)) ##对文件夹的创建时间排序if disk_size-disk_used < 10:time.sleep(10)shutil.rmtree(path_str + '/' + iterms[0])journal('delete ' + iterms[0] + time.strftime(" %Y-%m-%d %H:%M:%S\n", time.localtime()))time.sleep(1)
def run_threaded(job_func): ##多线程并发执行job_thread = threading.Thread(target=job_func)job_thread.start()
if __name__ == '__main__':# b=threading.Thread(target=server_bind())# a=threading.Thread(target=storage_space())# b.start()# a.start()# b.join()# a.join()# schedule.every(1).minutes.do(run_threaded,server_bind)# schedule.every(1).minutes.do(run_threaded,storage_space)if not os.path.exists(path_str):os.mkdir(path_str)schedule.every().day.at("21:00").do(run_threaded,Serber_start)schedule.every().day.at("21:00").do(run_threaded,storage_space)while True:schedule.run_pending()time.sleep(1)
服务器A完整代码
#coding=utf-8
import time
import os
import threading
import socket
import schedule
import hashlib
from functools import cmp_to_key
path_str = './home' ##working
ip = '127.0.0.1'
port = 6969
iterms_1 = '' ## name
def compare(x,y): ##文件夹排序函数--sort()stat_x = os.stat(path_str + '/' + x)stat_y = os.stat(path_str + '/' + y)if stat_x.st_ctime < stat_y.st_ctime:return 1elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一return -1else:return 0
def start():global path_strglobal iterms_1iterms = os.listdir(path_str)client = socket.socket()client.connect((ip,port))iterms.sort(key=cmp_to_key(compare)) ##对文件夹的创建时间排序iterms_1 = os.listdir((path_str + '/' +iterms[0]))client.send("{}".format(len(iterms_1)).encode('utf-8'))client.close()time.sleep(1)for iterm in iterms_1:client_start(iterms[0] + '/' + iterm)
def client_start(filename):global path_strglobal ipglobal portclient = socket.socket()client.connect((ip,port))size = os.stat(path_str + '/' + filename).st_sizename = filename.split('/')[-1] + ':' + str(size)time.sleep(0.5)client.send(name.encode('utf-8'))time.sleep(1)print(filename,size)with open(path_str + '/' + filename,'rb') as f:m = hashlib.md5()for line in f:client.send(line)m.update(line)md5 = m.hexdigest()client.send(md5.encode('utf-8'))client.close()time.sleep(1)
def run_threaded(job_func): ##多线程并发执行job_thread = threading.Thread(target=job_func)job_thread.start()
if __name__ == '__main__':# start()# schedule.every(0.1).minutes.do(run_threaded,Serber_start)# schedule.every(0.1).minutes.do(run_threaded,storage_space)schedule.every().day.at("21:01").do(run_threaded,start)while True:schedule.run_pending()time.sleep(1)
Linux下文件夹的自动同步相关推荐
- linux目录自动同步,linux 下面文件夹的自动同步 | Think in Drupal
linux 下面文件夹的自动同步 我们有一个Drupal网站,里面放了很多客户的文档资源,用户希望能够从一个磁盘上,备份到另一个磁盘上,这两个磁盘都可以访问到. 安装rsync 安装inotify t ...
- Linux下文件夹的移动与复制
Linux下文件夹的移动与复制 封面图片由文心一格AI生成 在Linux系统中,移动和复制文件夹是常见的任务.无论你是想要备份数据.迁移文件夹到其他位置还是归档数据,掌握文件夹的移动和复制技能都是必要 ...
- linux剪切到另一个文件夹,linux下文件夹操作常见命令如创建、复制、剪切、重命名、清空和删除命令 实例说明...
linux下文件夹操作常见命令如创建.复制.剪切.重命名.清空和删除命令 实例说明,在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinoz ...
- linux下剪切文件怎么恢复,linux下文件夹的创建、复制、剪切、重命名、清空和删除命令...
在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...
- 如何实现两个文件夹内容自动同步?
如何实现两个文件夹内容自动同步?这其实涉及到文件备份的相关知识,两个文件夹内容自动同步,简单里面就是两个文件夹里的文件内容要保持相同,专业一点来说就是双向同步备份. 我想很多小伙伴都想知道这个问题的答 ...
- 用FileYee轻松实现电脑文件夹双向自动同步备份?
如果一份文件可以自动在你的2个存储硬盘里进行备份保存,你觉得如何呢?对于一个每天面对很多重要文件的上班族来说,每天要保存很多的资料文件.但是总是担心公司电脑的损坏,造成公司重要资料文件的全部丢失. 最 ...
- linux创建目录无权限,linux下文件夹权限 linux 创建文件夹没有权限
linux 给所有文件下文件加权限 更改文件用户组.使用命令chgrp,命令如下. 更改文件所有者.使用命令chown. chown命令可以同时修改所有者和用户组名称(即拥有chgrp的功能),命令如 ...
- linux下文件夹作用总结
以下是linux系统常见的重要目录以及各个目作用: / 根目录. 包含了几乎所的文件目录.相当于中央系统.进入的最简单方法是:cd /. /boot 引导程序,内核等存放的目录. 这个目录,包括了在引 ...
- linux下文件夹的创建、复制、剪切、重命名、清空和删除命令
在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...
最新文章
- html lt table 设置数据,vue_+_element_ui_动态添加table数据
- python怎么查看列表_Python 小白,关于对于列表的+=操作不明白,查了半天也不知道怎么查,并且查询无果,请人指点?...
- 【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)
- Linux实验三:Shell编程
- nginx 非80、443端口跳转到80、443
- android 和ios 混合式开发环境安装
- 今日头条电脑版官方版_imclass电脑版下载-imclass在线教室pc版下载 v1.0.2 官方版...
- BBS(仿博客园系统)项目01(项目分析、表结构设计、注册功能实现)
- Javascript面向对象之私有静态变量
- js截取视频第一帧_JS截取视频第一帧
- echarts图表主题--马卡龙macarons--自己配置主题颜色
- 软件架构设计原则-里氏替换原则
- 2016版excel_Excel怎么转换成pdf?教你三招超简单方法
- 软件工程到底是学啥的?就业前景咋样?
- 一个关于埃森哲公司的经典笑话(转)
- JAVA + 酷Q开发人工智能QQ机器人
- python绘制主题河流图
- 通用feeds组件封装技巧
- 用一根网线,我废了整栋楼的网络!!!
- 以下哪种标签不是php起始 结束符,CIW中国网页设计师考试试题(Fireworks部分)及答案二...