清理服务器硬盘脚本

给你写好了一个安全、好用的一键清理脚本

这个脚本不仅会清理我们刚才排查出的 /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

瞬间就能搞定,脚本应该可以正常跑起来了!

相关推荐
布朗克1681 小时前
Go 入门到精通-16-字符串深入
开发语言·后端·golang·字符串
北冥you鱼1 小时前
Go flag 包详解:从命令行解析到实战应用
开发语言·后端·golang
她说彩礼65万2 小时前
Asp.net core 模型绑定
后端·asp.net
用户34232323763172 小时前
BLE 传感器节点实战
后端
fliter2 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
后端
羑悻2 小时前
我受够了 Coding Agent 的“假聪明,真串行”,于是做了 Meta-Orchestrator!
后端
神奇小汤圆2 小时前
字节二面挂了!被问“订单超时自动取消”
后端
饼干哥哥2 小时前
每晚300+个爆款疯狂跑,0人值守TikTok工厂开张!!
后端·操作系统·产品
65岁退休Coder2 小时前
LangChain v1.3.4 笔记 - 02 工具、结构化输出
后端