Files
xingrin/backend/apps/scan/scripts/run_cleanup.py

98 lines
3.0 KiB
Python

#!/usr/bin/env python
"""
清理任务脚本
用于动态容器执行清理任务,目前支持:
- results: 清理过期的扫描结果目录
如需添加其他清理任务,添加对应的 cleanup_xxx() 函数即可。
注意:此脚本只做文件清理,不需要 Django 环境。
"""
import argparse
import shutil
import logging
from datetime import datetime, timedelta
from pathlib import Path
logging.basicConfig(
level=logging.INFO,
format='[%(asctime)s] [%(levelname)s] %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)
def cleanup_results(results_dir: str, retention_days: int) -> dict:
"""
清理过期的扫描结果目录
Args:
results_dir: 扫描结果根目录
retention_days: 保留天数
Returns:
清理统计信息
"""
results_path = Path(results_dir)
if not results_path.exists():
logger.warning(f"扫描结果目录不存在: {results_dir}")
return {'deleted': 0, 'failed': 0, 'skipped': 0}
cutoff_date = datetime.now() - timedelta(days=retention_days)
stats = {'deleted': 0, 'failed': 0, 'skipped': 0, 'freed_bytes': 0}
logger.info(f"开始清理扫描结果 - 目录: {results_dir}, 保留天数: {retention_days}")
logger.info(f"清理截止时间: {cutoff_date}")
for item in results_path.iterdir():
if not item.is_dir():
continue
# 只处理 scan_ 开头的目录
if not item.name.startswith('scan_'):
stats['skipped'] += 1
continue
try:
# 获取目录修改时间
mtime = datetime.fromtimestamp(item.stat().st_mtime)
if mtime < cutoff_date:
# 计算目录大小
dir_size = sum(f.stat().st_size for f in item.rglob('*') if f.is_file())
# 删除目录
shutil.rmtree(item)
stats['deleted'] += 1
stats['freed_bytes'] += dir_size
logger.info(f" 已删除: {item.name} (修改时间: {mtime}, 大小: {dir_size / 1024 / 1024:.2f} MB)")
else:
stats['skipped'] += 1
except Exception as e:
logger.error(f" 删除失败: {item.name} - {e}")
stats['failed'] += 1
logger.info(f"清理完成 - 删除: {stats['deleted']}, 失败: {stats['failed']}, 跳过: {stats['skipped']}")
logger.info(f"释放空间: {stats['freed_bytes'] / 1024 / 1024:.2f} MB")
return stats
def main():
parser = argparse.ArgumentParser(description="清理任务")
parser.add_argument("--results_dir", type=str, default="/opt/xingrin/results", help="扫描结果目录")
parser.add_argument("--retention_days", type=int, default=7, help="保留天数")
args = parser.parse_args()
stats = cleanup_results(args.results_dir, args.retention_days)
print(f"清理完成: {stats}")
if __name__ == "__main__":
main()