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下文件夹的自动同步相关推荐

  1. linux目录自动同步,linux 下面文件夹的自动同步 | Think in Drupal

    linux 下面文件夹的自动同步 我们有一个Drupal网站,里面放了很多客户的文档资源,用户希望能够从一个磁盘上,备份到另一个磁盘上,这两个磁盘都可以访问到. 安装rsync 安装inotify t ...

  2. Linux下文件夹的移动与复制

    Linux下文件夹的移动与复制 封面图片由文心一格AI生成 在Linux系统中,移动和复制文件夹是常见的任务.无论你是想要备份数据.迁移文件夹到其他位置还是归档数据,掌握文件夹的移动和复制技能都是必要 ...

  3. linux剪切到另一个文件夹,linux下文件夹操作常见命令如创建、复制、剪切、重命名、清空和删除命令 实例说明...

    linux下文件夹操作常见命令如创建.复制.剪切.重命名.清空和删除命令 实例说明,在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinoz ...

  4. linux下剪切文件怎么恢复,linux下文件夹的创建、复制、剪切、重命名、清空和删除命令...

    在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...

  5. 如何实现两个文件夹内容自动同步?

    如何实现两个文件夹内容自动同步?这其实涉及到文件备份的相关知识,两个文件夹内容自动同步,简单里面就是两个文件夹里的文件内容要保持相同,专业一点来说就是双向同步备份. 我想很多小伙伴都想知道这个问题的答 ...

  6. 用FileYee轻松实现电脑文件夹双向自动同步备份?

    如果一份文件可以自动在你的2个存储硬盘里进行备份保存,你觉得如何呢?对于一个每天面对很多重要文件的上班族来说,每天要保存很多的资料文件.但是总是担心公司电脑的损坏,造成公司重要资料文件的全部丢失. 最 ...

  7. linux创建目录无权限,linux下文件夹权限 linux 创建文件夹没有权限

    linux 给所有文件下文件加权限 更改文件用户组.使用命令chgrp,命令如下. 更改文件所有者.使用命令chown. chown命令可以同时修改所有者和用户组名称(即拥有chgrp的功能),命令如 ...

  8. linux下文件夹作用总结

    以下是linux系统常见的重要目录以及各个目作用: / 根目录. 包含了几乎所的文件目录.相当于中央系统.进入的最简单方法是:cd /. /boot 引导程序,内核等存放的目录. 这个目录,包括了在引 ...

  9. linux下文件夹的创建、复制、剪切、重命名、清空和删除命令

    在home目录下有wwwroot目录,wwwroot下有sinozzz目录,即/home/wwwroot/sinozzz 一.目录创建 在/home/wwwroot目录下新建一个sinozzz123的 ...

最新文章

  1. html lt table 设置数据,vue_+_element_ui_动态添加table数据
  2. python怎么查看列表_Python 小白,关于对于列表的+=操作不明白,查了半天也不知道怎么查,并且查询无果,请人指点?...
  3. 【牛客 - 181C】序列(前缀和,二分,可用set维护)(有坑)
  4. Linux实验三:Shell编程
  5. nginx 非80、443端口跳转到80、443
  6. android 和ios 混合式开发环境安装
  7. 今日头条电脑版官方版_imclass电脑版下载-imclass在线教室pc版下载 v1.0.2 官方版...
  8. BBS(仿博客园系统)项目01(项目分析、表结构设计、注册功能实现)
  9. Javascript面向对象之私有静态变量
  10. js截取视频第一帧_JS截取视频第一帧
  11. echarts图表主题--马卡龙macarons--自己配置主题颜色
  12. 软件架构设计原则-里氏替换原则
  13. 2016版excel_Excel怎么转换成pdf?教你三招超简单方法
  14. 软件工程到底是学啥的?就业前景咋样?
  15. 一个关于埃森哲公司的经典笑话(转)
  16. JAVA + 酷Q开发人工智能QQ机器人
  17. python绘制主题河流图
  18. 通用feeds组件封装技巧
  19. 用一根网线,我废了整栋楼的网络!!!
  20. 以下哪种标签不是php起始 结束符,CIW中国网页设计师考试试题(Fireworks部分)及答案二...

热门文章

  1. knife4j文档请求异常(swagger页面无法渲染)
  2. 上大学要学些啥?干些啥?
  3. 【好书推荐】——书中自有颜如玉,书中自有黄金屋
  4. Android播放器的三种实现方法
  5. 《将军吟》杂记---莫应丰、著、人民文学出版社
  6. webpack打包 iPhone7 iOS10.3.3 hybird vue H5离线包白屏问题
  7. 线上讲座 “计算机科学与技术”学科导论 笔记
  8. App 启动速度优化
  9. 计算机系统 流水线技术
  10. Dubbo从入门到精通(全)