对于长期运行的 CentOS 服务器而言,系统日积月累产生的日志文件、临时文件、软件缓存等会逐渐占用大量磁盘空间,甚至影响系统性能,手动清理不仅繁琐,而且容易遗漏,创建一个自动化、可定制的清理垃圾脚本,是系统管理员一项高效且必要的日常维护工作。
识别主要的垃圾来源
在编写脚本之前,我们首先需要明确 CentOS 系统中常见的“垃圾”文件分布在何处,主要可以分为以下几类:
- 软件包缓存:使用
yum
或dnf
安装软件后,下载的安装包会保留在/var/cache/yum/
或/var/cache/dnf/
目录下。 - 系统日志:日志文件位于
/var/log/
目录下,如messages
,secure
,cron
等,以及 systemd 的日志,它们会无限制地增长。 - 临时文件:系统和应用程序产生的临时文件存放在
/tmp
和/var/tmp
目录中。 - 旧内核:系统更新后,旧的内核版本默认不会被删除,占用着
/boot
分区的宝贵空间。 - 孤立软件包:曾作为依赖被安装,但现在其主应用已卸载,这些包就成了“孤儿”。
构建清理脚本:分步解析
一个健壮的清理脚本应当具备功能模块化、执行安全的特点,下面我们将逐一构建脚本的各个功能模块。
清理软件包缓存
这是最安全、最直接的清理步骤,Yum/DNF 提供了内置的清理命令。
echo "正在清理 Yum/DNF 缓存..." dnf clean all 2>/dev/null || yum clean all echo "Yum/DNF 缓存清理完毕。"
脚本中同时兼容 dnf
(CentOS 8+) 和 yum
(CentOS 7),并使用 2>/dev/null
抑制可能出现的错误信息,使输出更干净。
清理系统日志
对于传统的日志文件,我们可以删除超过一定天数的日志,对于 systemd 日志,使用 journalctl
是最佳选择。
echo "正在清理超过 30 天的系统日志..." find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} ; echo "传统日志清理完毕。" echo "正在限制 systemd 日志大小..." journalctl --vacuum-size=100M echo "systemd 日志限制完毕。"
这里,我们删除了30天前修改过的 .log
文件,并将 systemd 日志总大小限制在 100MB。-mtime +30
是一个精准的时间过滤器。
清理旧的内核
保留当前正在使用的内核和上一版本作为备份,删除其余所有旧内核,是释放 /boot
空间的有效手段。
echo "正在清理旧的内核..." # 安装 yum-utils 工具(如果尚未安装) if ! command -v package-cleanup &> /dev/null; then dnf install -y yum-utils || yum install -y yum-utils fi # 保留最新的两个内核 package-cleanup --oldkernels --count=2 -y echo "旧内核清理完毕。"
package-cleanup
是 yum-utils
提供的一个强大工具,--count=2
表示保留两个最新的内核版本。
清理临时文件
/tmp
目录下的文件通常可以安全删除,特别是那些长时间未被访问的。
echo "正在清理超过 7 天的临时文件..." find /tmp -type f -atime +7 -delete find /var/tmp -type f -atime +7 -delete echo "临时文件清理完毕。"
-atime +7
表示删除7天前未被访问过的文件,相比 -mtime
(修改时间)在某些场景下更安全。
完整脚本与使用指南
将以上模块整合,并加入一些安全提示和日志输出,就形成了一个完整的清理脚本。
#!/bin/bash # CentOS 系统垃圾清理脚本 # 建议在执行前备份重要数据 set -e # 遇到错误立即退出 echo "=========== 开始系统垃圾清理 ===========" # 1. 清理软件包缓存 echo "步骤 1/4: 清理软件包缓存..." dnf clean all 2>/dev/null || yum clean all echo "✔ 软件包缓存清理完毕。" # 2. 清理系统日志 echo "步骤 2/4: 清理系统日志..." find /var/log -type f -name "*.log" -mtime +30 -exec rm -f {} ; journalctl --vacuum-size=100M echo "✔ 系统日志清理完毕。" # 3. 清理旧的内核 echo "步骤 3/4: 清理旧的内核..." if ! command -v package-cleanup &> /dev/null; then dnf install -y yum-utils || yum install -y yum-utils fi package-cleanup --oldkernels --count=2 -y echo "✔ 旧内核清理完毕。" # 4. 清理临时文件 echo "步骤 4/4: 清理临时文件..." find /tmp -type f -atime +7 -delete find /var/tmp -type f -atime +7 -delete echo "✔ 临时文件清理完毕。" echo "=========== 垃圾清理任务完成 ==========="
使用方法:
- 将以上代码保存为
cleanup.sh
。 - 赋予执行权限:
chmod +x cleanup.sh
。 - 以 root 权限执行:
sudo ./cleanup.sh
。
为了方便管理,我们可以将上述清理策略归纳为下表:
清理目标 | 主要目录/工具 | 核心命令示例 | 清理策略 |
---|---|---|---|
软件包缓存 | /var/cache/yum , /var/cache/dnf | dnf clean all | 删除所有缓存 |
系统日志 | /var/log , journalctl | find ... -mtime +30 , journalctl --vacuum-size=100M | 删除30天前的日志,限制总大小 |
旧的内核 | /boot | package-cleanup --oldkernels --count=2 | 保留最新的2个内核 |
临时文件 | /tmp , /var/tmp | find ... -atime +7 -delete | 删除7天前未访问的文件 |
相关问答FAQs
Q1: 运行这个清理脚本安全吗?我需要注意什么?
A1: 该脚本中的命令都是系统维护中的标准操作,总体上是安全的,但任何自动化删除操作都存在潜在风险,请务必注意以下几点:
- 备份: 在首次在任何生产服务器上运行前,请确保已对重要数据进行备份。
- 测试: 建议先在测试环境中运行脚本,观察其行为和结果是否符合预期。
- 理解命令: 请确保您理解脚本中每一个
rm
或find -delete
命令的作用,不要盲目运行来源不明的脚本。 - 检查日志文件: 某些应用程序可能对日志文件的路径和保留策略有特殊要求,清理前请确认。
Q2: 我应该多久运行一次这个脚本?可以自动运行吗?
A2: 运行频率取决于服务器的使用情况和磁盘容量。
- 对于生产服务器: 如果服务器日志增长快或磁盘空间紧张,可以设置为每周或每两周运行一次。
- 对于个人或开发环境: 一个月运行一次通常就足够了。
您可以通过cron
任务来实现自动化,以 root 用户编辑 crontab:sudo crontab -e
,然后添加一行,在每周日凌晨3点自动运行脚本:
0 3 * * 0 /path/to/your/cleanup.sh > /var/log/cleanup.log 2>&1
这样,脚本就会在后台定期执行,并将输出日志重定向到/var/log/cleanup.log
文件中以供查验。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复