1. 脚本需求
轮询某个目录下的所有文件,包括子目录中的文件,计算文件修改时间距离现在有多长时间
2. 脚本
#!/usr/bin/env python3
#coding:utf-8
#################################
#检查文件修改时间,然后更新到对端
#author:zhanghao
#time:20210101
#################################
import os
import logging
import sys
import subprocess
import datetime
def logger(obj):
'''
提供日志文件
'''
logger = logging.getLogger(obj)
logger.setLevel(logging.INFO)
log_file_dir = os.getcwd()
log_file_name = sys.argv[0].split(".")[0] + '.log'
st_handler = logging.StreamHandler()
fl_handler = logging.FileHandler(
filename = os.path.join(log_file_dir, log_file_name),
mode = 'a',
encoding = "utf-8")
st_formatter = logging.Formatter("%(message)s")
fl_formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s: %(message)s")
fl_handler.setLevel(logging.INFO)
st_handler.setFormatter(st_formatter)
fl_handler.setFormatter(fl_formatter)
# logger.addHandler(st_handler)
logger.addHandler(fl_handler)
return logger
#logger(sys.argv[0]).info("this is test")
def command(cmd):
'''
执行shell命令
'''
sub = subprocess.Popen(
cmd,
shell=True,
close_fds=True,
stdout=subprocess.PIPE,
stderr = subprocess.PIPE)
data, error = sub.communicate()
if sub.returncode != 0:
logger(sys.argv[0]).error("执行{}命令报错,报错信息如下\n {}".format(cmd, error))
logger(sys.argv[0]).info("执行{}命令成功, 输出如下:\n {}".format(cmd, data))
return data
def scan_file(dir_path):
'''
监控文件的修改时间
'''
file_diff_time = {}
for root, dirs, files in os.walk(dir_path):
for filename in files:
time_stamp = os.lstat(os.path.join(root, filename)).st_mtime
time_array = datetime.datetime.fromtimestamp(time_stamp).strftime("%Y-%m-%d %H:%M:%S.%f")
now_time = datetime.datetime.now()
modify_time = datetime.datetime.strptime(time_array, "%Y-%m-%d %H:%M:%S.%f")
diff_time = (now_time - modify_time)
days = diff_time.days
hours = diff_time.seconds // 3600
minutes = (diff_time.seconds % 3600) // 60
file_diff_time[filename] = [ days, hours, minutes ]
# logger(sys.argv[0]).info("{}: 修改时间为 [{}] 距离今天有[{}天{}时{}分]".format(os.path.join(root, filename), modify_time, days, hours, minutes))
print("{}: 修改时间为 [{}] 距离今天有[{}天{}时{}分]".format(os.path.join(root, filename), modify_time, days, hours, minutes))
logger(sys.argv[0]).info("轮询{}下面修改文件时间: \n {}".format(dir_path, file_diff_time))
return file_diff_time
result = scan_file("/etc/")
3. 输出
3.1 屏幕输出
3.2 日志输出
4. bug
logger函数有问题,会循环多次,导致一个文件打印多个info的log记录