自动化脚本如何清理未关联资源

wen 实用脚本 1

本文目录导读:

自动化脚本如何清理未关联资源

  1. 文件系统:清理未使用的文件/文件夹
  2. Docker:清理未使用的容器、镜像、卷
  3. Git:清理未关联的远程分支(Stale Branches)
  4. 前端构建:清理未使用的样式/组件
  5. 数据库:清理无外键关联的孤立记录
  6. Linux 系统:清理无冗余库依赖
  7. AWS S3:清理未通过 CDN 引用的文件
  8. ⚠️ 关键注意事项
  9. 推荐自动化编排工具

清理未关联资源(如孤立文件、未使用的变量、僵尸对象、无引用的资源等)是提升系统性能、降低存储成本的关键维护手段,具体实现方式取决于你正在清理的资源类型(如文件系统、Docker、Git仓库、数据库或前端构建产物)。

以下是针对不同场景的自动化脚本清理方案及核心逻辑:

文件系统:清理未使用的文件/文件夹

场景:用户上传的临时文件、日志缓存、备份文件等未被任何数据库记录引用的文件。

核心逻辑:遍历目录 → 对比数据库或索引记录 → 删除差异项。

示例脚本(Python + Shell)

#!/bin/bash
# 清理 uploads/ 目录下未被数据库记录的图片
DB_IMAGES=$(mysql -u root -p'password' -e "SELECT filename FROM media" -N)
UPLOAD_DIR="/var/www/uploads"
for file in "$UPLOAD_DIR"/*; do
    filename=$(basename "$file")
    if ! echo "$DB_IMAGES" | grep -q "$filename"; then
        echo "Deleting orphan file: $file"
        rm -f "$file"
    fi
done

Python版本(更可控)

import os, mysql.connector
# 获取已记录的文件名
conn = mysql.connector.connect(host='...', user='root', password='...', database='myapp')
cursor = conn.cursor()
cursor.execute("SELECT filename FROM media")
recorded = set(row[0] for row in cursor.fetchall())
# 扫描目录
upload_dir = "/var/www/uploads"
for f in os.listdir(upload_dir):
    if f not in recorded:
        os.remove(os.path.join(upload_dir, f))
        print(f"Deleted {f}")

Docker:清理未使用的容器、镜像、卷

场景:停止的容器、<none> 悬空镜像、未被任何容器引用的卷。

自动化脚本

#!/bin/bash
# 清理所有未使用的 Docker 资源(容器、镜像、网络、卷)
docker system prune -a -f --volumes
# 或仅清理特定类型
# docker image prune -a -f    # 清理所有未使用的镜像
# docker volume prune -f      # 清理未使用的卷
# docker container prune -f   # 清理停止的容器

定时任务(cron)

# 每天凌晨 3 点执行
0 3 * * * /usr/bin/docker system prune -a -f --volumes >> /var/log/docker_cleanup.log 2>&1

Git:清理未关联的远程分支(Stale Branches)

场景:远程仓库中已被删除的分支,但在本地仍存在引用。

自动化脚本

#!/bin/bash
# 方法1:自动 prune(推荐)
git remote prune origin
# 方法2:强制删除本地所有已不存在于远程的分支
git fetch --prune
git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}' | xargs git branch -D

前端构建:清理未使用的样式/组件

场景:大型前端项目中,有些 CSS 类或组件文件不再被任何页面引用。

推荐工具

  • PurifyCSS(已停止维护,推荐 PurgeCSS
  • UnCSS

自动化脚本(npm script)

{
  "scripts": {
    "clean:unused-css": "purgecss --css build/*.css --content build/*.html --output build/cleaned/"
  }
}

CodeQL / SonarQube:用于检测未使用的 JavaScript/TypeScript 变量或 import。

数据库:清理无外键关联的孤立记录

场景:用户删除后,其冗余的地址记录、文章被删后遗留的评论未被删除。

SQL + Shell 脚本

#!/bin/bash
# 清理用户表中已删除用户对应的地址表孤立记录
mysql -u root -p'password' -e "
DELETE FROM addresses
WHERE user_id NOT IN (SELECT id FROM users);
"

更复杂的递归清理

-- 清理无关联文章的所有评论
DELETE FROM comments WHERE article_id NOT IN (SELECT id FROM articles);

Linux 系统:清理无冗余库依赖

场景apt-getyum 留下的未使用依赖包。

自动化脚本

# Debian/Ubuntu
sudo apt-get autoremove -y
sudo apt-get autoclean -y
# CentOS/RHEL
sudo yum autoremove -y

AWS S3:清理未通过 CDN 引用的文件

场景:S3 存储桶中存储了文件,但从未被任何日志记录下载。

Python(boto3)脚本

import boto3
from datetime import datetime, timedelta
s3 = boto3.client('s3')
bucket = 'my-bucket'
# 获取所有未被访问超过 90 天的对象
objects = s3.list_objects_v2(Bucket=bucket)['Contents']
for obj in objects:
    last_accessed = obj['LastModified']
    if datetime.now() - last_accessed > timedelta(days=90):
        print(f"Deleting {obj['Key']}")
        s3.delete_object(Bucket=bucket, Key=obj['Key'])

⚠️ 关键注意事项

风险类型 预防措施
误删 始终先用 -dry-run 模拟执行,确认结果。
先移动到回收站或备份目录,而非直接删除。
rmdocker prune 等破坏性操作添加 -v 日志。
性能影响 对大目录使用 find -mtime 增量扫描。
设置执行频率(如每天凌晨低峰期)。
对 S3/数据库等云服务,注意 API 调用次数限制。
依赖关系 数据库清理:先检查外键约束,使用 ON DELETE CASCADE 简化。
Docker:prune 操作可能影响共享的 volume,确认无其他容器使用。
权限安全 脚本应使用 最小权限服务账号(非 root),如仅对特定目录有 r+w 权限。

推荐自动化编排工具

  • Ansible / SaltStack:批量管理多个服务器,定义清理 playbook。
  • Jenkins / GitLab CI:定期执行清理 pipeline,并发送成功/失败通知。
  • Rundeck:可视化运维,支持审批和回滚。
  • Kubernetes CronJob:在 K8s 集群内定期清理未使用的 PVC、旧镜像。

终极建议:任何自动化清理脚本都应先在一个测试环境中运行至少一周,验证不会破坏业务逻辑,再部署到生产环境。

抱歉,评论功能暂时关闭!