给你写好了一个安全、好用的一键清理脚本。
这个脚本不仅会清理我们刚才排查出的 /root/logs 历史日志和系统邮件,还会顺手清理系统的临时缓存、系统日志,并且绝对不会误删任何正在运行的业务数据。
🛠️ 第一步:创建并部署脚本
请在服务器上直接执行以下步骤:
1.创建脚本文件: 10秒。
在服务器终端直接运行以下命令,新建一个名为 clean.sh 的文件:
Bash
bash
vi /root/clean.sh
2.复制并粘贴脚本内容: 30秒。
按一下键盘上的小写字母 i 进入编辑模式,然后把下方框里的脚本代码完整复制并粘贴 进去。粘贴完成后,按键盘上的 Esc 键,然后输入 :wq 并回车保存退出。
3.赋予脚本执行权限: 10秒。
给脚本加上可执行权限,否则无法直接运行:
Bash
bash
chmod +x /root/clean.sh
📄 脚本完整代码
你可以直接复制这段代码粘贴到 /root/clean.sh 中:
Bash
bash
#!/bin/bash
# ==========================================
# 脚本名称:服务器一键安全清理脚本
# 适用系统:CentOS / Debian / Ubuntu
# ==========================================
# 确保必须是 root 用户运行
if [ "$EUID" -ne 0 ]; then
echo -e "\e[31m[错误] 请以 root 用户运行此脚本!\e[0m"
exit 1
fi
echo -e "\e[35m================================================\e[0m"
echo -e "\e[35m 开始执行服务器安全清理 \e[0m"
echo -e "\e[35m================================================\e[0m"
# 1. 记录清理前的磁盘空间
echo -e "\e[33m[1/5] 正在记录清理前的磁盘空间...\e[0m"
df -h /
echo ""
# 2. 清理 /root/logs 下 1 天前的历史 master-stdout 日志
echo -e "\e[33m[2/5] 正在清理 /root/logs 下的历史日志 (安全保留当天日志)...\e[0m"
LOG_DIR="/root/logs"
if [ -d "$LOG_DIR" ]; then
# 查找并删除 1 天前修改过的 master-stdout.log.* 文件
DELETED_COUNT=$(find "$LOG_DIR" -type f -name "master-stdout.log.*" -mtime +0 | wc -l)
find "$LOG_DIR" -type f -name "master-stdout.log.*" -mtime +0 -delete
echo -e "\e[32m✔ 已成功清理 $DELETED_COUNT 个历史日志文件。\e[0m"
else
echo -e "\e[31mℹ 未找到日志目录 $LOG_DIR,跳过此步。\e[0m"
fi
# 3. 清理系统 root 邮件
echo -e "\e[33m[3/5] 正在清空 root 系统邮件 (/var/spool/mail/root)...\e[0m"
MAIL_FILE="/var/spool/mail/root"
if [ -f "$MAIL_FILE" ]; then
MAIL_SIZE=$(du -sh "$MAIL_FILE" | awk '{print $1}')
> "$MAIL_FILE"
echo -e "\e[32m✔ 已成功清空系统邮件 (原大小: $MAIL_SIZE)。\e[0m"
else
echo -e "\e[32m✔ 未发现系统邮件,跳过此步。\e[0m"
fi
# 4. 清理 systemd journal 历史系统日志 (只保留最近 7 天)
echo -e "\e[33m[4/5] 正在清理 systemd journal 系统日志...\e[0m"
if command -v journalctl >/dev/null 2>&1; then
journalctl --vacuum-time=7d >/dev/null 2>&1
echo -e "\e[32m✔ 已清理 7 天前的 journal 系统日志。\e[0m"
else
echo -e "\e[31mℹ 系统不支持 journalctl,跳过此步。\e[0m"
fi
# 5. 清除系统包管理器缓存 (yum 或 apt)
echo -e "\e[33m[5/5] 正在清除系统安装包缓存...\e[0m"
if command -v yum >/dev/null 2>&1; then
yum clean all >/dev/null 2>&1
echo -e "\e[32m✔ YUM 缓存清理完成。\e[0m"
elif command -v apt-get >/dev/null 2>&1; then
apt-get clean >/dev/null 2>&1
echo -e "\e[32m✔ APT 缓存清理完成。\e[0m"
fi
# 6. 清理宝塔面板回收站(如果有的话)
RECYCLE_BIN="/.Recycle_bin"
if [ -d "$RECYCLE_BIN" ]; then
echo -e "\e[33m[额外步骤] 检测到回收站目录,正在清空...\e[0m"
rm -rf "$RECYCLE_BIN"/*
echo -e "\e[32m✔ 回收站已彻底清空。\e[0m"
fi
echo -e "\e[35m================================================\e[0m"
echo -e "\e[32m 🎉 垃圾清理完成!🎉 \e[0m"
echo -e "\e[35m================================================\e[0m"
# 7. 展示清理后的空间
echo -e "\e[33m清理后的磁盘空间状态:\e[0m"
df -h /
🚀 以后如何使用?
1. 手动运行
以后你觉得服务器卡了,或者空间不够了,直接登录服务器运行下面这行命令即可:
Bash
bash
/root/clean.sh
报错:
bash
[root@vm www]# ./clean.sh
-bash: ./clean.sh: /bin/bash^M: bad interpreter: No such file or directory
这个报错非常经典!它的意思是脚本里的换行符是 Windows 格式(CRLF) ,而 Linux 系统只认 Unix 格式(LF) 。
报错里的 ^M 就是多出来的 Windows 回车符,导致 Linux 把解释器识别成了 /bin/bash\r,自然就找不到这个文件了。
解决起来非常简单,只需要用 sed 命令把脚本里的 Windows 换行符替换掉即可。
🛠️ 解决步骤
在当前 /www 目录下,直接运行以下两行命令:
Bash
bash
# 1. 过滤掉脚本里的 Windows 换行符(把 \r 删掉)
sed -i 's/\r$//' ./clean.sh
# 2. 重新运行脚本
./clean.sh
瞬间就能搞定,脚本应该可以正常跑起来了!