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 -1
    elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一
        return 1
    else:
        return 0

定义多线程函数

def run_threaded(job_func): ##多线程并发执行
    job_thread = threading.Thread(target=job_func)
    job_thread.start()

监听,每天定时执行,A和B错开一分钟确保不会掉线

#服务器B
    schedule.every().day.at("21:01").do(run_threaded,start)
    while True:
        schedule.run_pending()
        time.sleep(1)
#服务器A
    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)

创建收发信息的日志文件

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_str
    disk = os.statvfs(path_str)
    disk_size = disk.f_bsize * disk.f_blocks / (1024 ** 3)  # 1G = 1024M  1M = 1024KB 1KB = 1024bytes
    disk_used = disk.f_bsize * (disk.f_blocks - disk.f_bfree) / (1024 ** 3)
    count = time.time()
    while True:
        if time.time() - count > 600:
            break
        iterms = 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 ip
    global port
    server = 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 = True
    count = 0
    count_1 = -1
    while True:
        if count_1 == count:
            break
        conn, addr = server.accept()
        if flag:
            count_1 = int(conn.recv(1024).decode('utf-8'))
            flag = False
            conn.close()
            continue
        Serber_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 = 0
    with 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 = 1024
            else:
                size = filesize - received_size
            data=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 -1
    elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一
        return 1
    else:
        return 0
def storage_space(): ##监视磁盘空间,当磁盘空间少于10时,删除最先创建的文件夹
    global path_str
    disk = os.statvfs(path_str)
    disk_size = disk.f_bsize * disk.f_blocks / (1024 ** 3)  # 1G = 1024M  1M = 1024KB 1KB = 1024bytes
    disk_used = disk.f_bsize * (disk.f_blocks - disk.f_bfree) / (1024 ** 3)
    count = time.time()
    while True:
        if time.time() - count > 600:
            break
        iterms = 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 1
    elif stat_x.st_ctime > stat_y.st_ctime: ##由操作系统的ctime统一
        return -1
    else:
        return 0
def start():
    global path_str
    global iterms_1
    iterms = 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_str
    global ip
    global port
    client = socket.socket()
    client.connect((ip,port))
    size = os.stat(path_str + '/' + filename).st_size
    name = 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)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万家灯火@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值