Kylin 系统下使用 Shell 脚本定期清理 7 天前的 .bin 文件
一、需求背景
在 Kylin 系统中,程序会持续向指定目录生成 .bin 文件,例如:
bash
/home/kylin/xx
随着系统长期运行,.bin 文件会越来越多,占用磁盘空间。因此需要实现一个自动清理机制:
text
1. 定期清理 /home/kylin/xx 目录下的 .bin 文件
2. 按文件修改时间判断
3. 删除修改时间超过 7 天的文件
4. 如果 /home/kylin/xx 目录不存在,则直接忽略
5. 计算机重启后也能自动执行清理
6. 每天凌晨 1 点自动执行一次
7. 日志文件也放在 /home/kylin/xx 目录下
8. 文件可能属于 root 用户,因此脚本需要使用 root 定时执行
二、清理方式选择
文件清理可以有两种判断方式:
text
1. 按文件名中的时间判断
2. 按文件修改时间判断
本方案采用第二种:按文件修改时间判断。
原因是:
text
1. 不需要解析文件名
2. 文件名格式变化也不影响清理逻辑
3. Linux 自带 find 命令可以直接判断修改时间
4. 脚本更简单,稳定性更好
核心命令是:
bash
find /home/kylin/xx -maxdepth 1 -type f -name "*.bin" -mmin +10080
其中:
text
-maxdepth 1 只处理当前目录,不进入子目录
-type f 只处理普通文件
-name "*.bin" 只匹配 .bin 文件
-mmin +10080 修改时间超过 10080 分钟
10080 的计算方式为:
text
7 天 × 24 小时 × 60 分钟 = 10080 分钟
相比 -mtime +7,-mmin +10080 对"超过 7 天"的判断更精确。
三、完整脚本
脚本路径建议放在:
bash
/home/kylin/clean_bin.sh
日志文件放在:
bash
/home/kylin/xx/clear_old_bin.log
完整脚本如下:
bash
#!/bin/bash
# 目标目录
DIR="/home/kylin/xx"
# 日志文件放在 xx 目录下
LOG_FILE="/home/kylin/xx/clear_old_bin.log"
# 锁文件,防止脚本重复执行
LOCK_FILE="/tmp/clear_old_bin.lock"
(
# 防止脚本重复执行
flock -n 200 || exit 1
# 判断目录是否存在
# 因为日志文件也放在 xx 目录下,所以目录不存在时直接退出
if [ ! -d "$DIR" ]; then
exit 0
fi
# 日志文件超过 5MB 时清空,避免长期运行后日志过大
if [ -f "$LOG_FILE" ]; then
LOG_SIZE=$(stat -c%s "$LOG_FILE" 2>/dev/null)
if [ "$LOG_SIZE" -gt 5242880 ]; then
echo "========== $(date '+%Y-%m-%d %H:%M:%S') log file too large, clear log ==========" > "$LOG_FILE"
fi
fi
echo "========== $(date '+%Y-%m-%d %H:%M:%S') start clear ==========" >> "$LOG_FILE"
# 删除修改时间超过 7 天的 .bin 文件
find "$DIR" -maxdepth 1 -type f -name "*.bin" -mmin +10080 -print | while read -r file
do
if rm -f "$file"; then
echo "$(date '+%Y-%m-%d %H:%M:%S') deleted: $file" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S') delete failed: $file" >> "$LOG_FILE"
fi
done
echo "========== $(date '+%Y-%m-%d %H:%M:%S') end clear ==========" >> "$LOG_FILE"
echo "" >> "$LOG_FILE"
) 200>"$LOCK_FILE"
四、脚本说明
1. 目标目录
bash
DIR="/home/kylin/xx"
表示需要清理的目录。
2. 日志文件
bash
LOG_FILE="/home/kylin/xx/clear_old_bin.log"
日志文件放在 xx 文件夹下,方便和数据文件放在一起管理。
日志中会记录:
text
1. 脚本开始时间
2. 删除了哪些文件
3. 哪些文件删除失败
4. 脚本结束时间
3. 锁文件
bash
LOCK_FILE="/tmp/clear_old_bin.lock"
锁文件用于防止脚本重复执行。
例如:
text
1. 开机时执行了一次脚本
2. 定时任务又刚好开始执行
3. 或者上一次清理还没有结束,下一次清理又启动
这种情况下,flock 可以保证同一时间只有一个清理脚本在运行。
核心代码:
bash
flock -n 200 || exit 1
如果脚本已经在运行,新的脚本会直接退出。
4. 判断目录是否存在
bash
if [ ! -d "$DIR" ]; then
exit 0
fi
如果 /home/kylin/xx 不存在,脚本直接退出。
这里使用 exit 0,表示正常退出,不影响系统其他任务。
由于日志文件也放在 /home/kylin/xx 目录下,所以目录不存在时无法写日志,因此直接忽略即可。
5. 日志大小控制
bash
if [ -f "$LOG_FILE" ]; then
LOG_SIZE=$(stat -c%s "$LOG_FILE" 2>/dev/null)
if [ "$LOG_SIZE" -gt 5242880 ]; then
echo "========== $(date '+%Y-%m-%d %H:%M:%S') log file too large, clear log ==========" > "$LOG_FILE"
fi
fi
这段代码用于控制日志文件大小。
当日志超过 5MB 时,会自动清空日志,避免日志文件长期增长。
其中:
text
5242880 字节 = 5MB
6. 删除 7 天前的 .bin 文件
bash
find "$DIR" -maxdepth 1 -type f -name "*.bin" -mmin +10080 -print
这条命令查找 /home/kylin/xx 目录下修改时间超过 7 天的 .bin 文件。
然后通过:
bash
rm -f "$file"
逐个删除。
之所以没有直接使用:
bash
-delete
是因为使用 rm -f 可以配合日志记录每一个被删除的文件,后期排查更方便。
五、创建脚本文件
执行:
bash
vim /home/kylin/clean_bin.sh
按 i 进入编辑模式,将完整脚本粘贴进去。
保存退出:
vim
Esc
:wq
回车
六、解决 Windows 换行符问题
如果脚本是从 Windows 复制到 Kylin 系统中的,执行时可能出现:
bash
/bin/bash^M:解释器错误: 没有那个文件或目录
这是因为文件使用了 Windows 的 CRLF 换行格式,而 Linux 需要 LF 格式。
可以使用下面命令转换:
bash
sed -i 's/\r$//' /home/kylin/clean_bin.sh
也可以用 dos2unix:
bash
dos2unix /home/kylin/clean_bin.sh
查看是否还存在 ^M:
bash
cat -A /home/kylin/clean_bin.sh | head
正常情况下第一行应该是:
bash
#!/bin/bash$
如果看到:
bash
#!/bin/bash^M$
说明还没有转换成功。
七、添加执行权限
执行:
bash
chmod +x /home/kylin/clean_bin.sh
如果文件属于 root,也可以使用:
bash
sudo chmod +x /home/kylin/clean_bin.sh
八、手动测试脚本
由于 .bin 文件可能属于 root 用户,建议使用 root 权限测试:
bash
sudo /home/kylin/clean_bin.sh
查看日志:
bash
sudo cat /home/kylin/xx/clear_old_bin.log
如果没有超过 7 天的 .bin 文件,日志可能类似:
text
========== 2026-06-12 10:00:00 start clear ==========
========== 2026-06-12 10:00:00 end clear ==========
如果删除了文件,日志可能类似:
text
2026-06-12 10:00:00 deleted: /home/kylin/xx/2026-06-01-16.bin
九、先查看哪些文件会被删除
正式投入使用前,可以先执行下面命令:
bash
find /home/kylin/xx -maxdepth 1 -type f -name "*.bin" -mmin +10080 -print
这条命令只显示将要被清理的文件,不会删除。
确认无误后,再执行脚本。
十、配置定时任务
由于 .bin 文件所属用户可能是 root,所以建议使用 root 的 crontab。
执行:
bash
sudo crontab -e
第一次执行时,系统可能提示选择编辑器:
text
Select an editor.
1. /usr/bin/vim.basic
2. /usr/bin/vim.tiny
建议选择:
text
vim.basic
输入对应数字,例如:
bash
1
然后按回车。
进入 vim 后,按 i 进入编辑模式,在最后添加:
bash
@reboot /home/kylin/clean_bin.sh
0 1 * * * /home/kylin/clean_bin.sh
然后保存退出:
vim
Esc
:wq
回车
十一、定时任务含义
bash
@reboot /home/kylin/clean_bin.sh
表示系统重启后自动执行一次清理脚本。
bash
0 1 * * * /home/kylin/clean_bin.sh
表示每天凌晨 1 点执行一次清理脚本。
因此最终效果是:
text
1. 计算机重启后自动清理一次
2. 每天凌晨 1 点自动清理一次
十二、查看定时任务是否配置成功
执行:
bash
sudo crontab -l
如果看到:
bash
@reboot /home/kylin/clean_bin.sh
0 1 * * * /home/kylin/clean_bin.sh
说明配置成功。
十三、确认 cron 服务是否正常
Kylin 系统中 cron 服务名称可能是 cron,也可能是 crond。
先查看:
bash
systemctl status cron
如果提示没有该服务,再查看:
bash
systemctl status crond
如果服务没有启动,可以执行:
bash
sudo systemctl enable cron
sudo systemctl start cron
如果系统服务名是 crond,则执行:
bash
sudo systemctl enable crond
sudo systemctl start crond
十四、常见问题
1. 报错 /bin/bash^M
原因是脚本使用了 Windows 换行格式。
解决:
bash
sed -i 's/\r$//' /home/kylin/clean_bin.sh
2. 执行脚本提示权限不足
可能原因:
text
1. 脚本没有执行权限
2. .bin 文件属于 root
3. /home/kylin/xx 目录没有当前用户的写权限
解决:
bash
sudo chmod +x /home/kylin/clean_bin.sh
sudo /home/kylin/clean_bin.sh
定时任务也使用 root 配置:
bash
sudo crontab -e
3. 为什么不用普通用户 crontab?
如果 .bin 文件是 root 程序生成的,普通用户可能无权删除。
因此推荐:
text
root 生成文件
root 执行清理脚本
root 管理定时任务
这样权限关系最清晰。
4. 日志文件会不会越来越多?
不会生成多个日志文件,因为脚本使用的是同一个日志文件:
bash
/home/kylin/xx/clear_old_bin.log
每次执行都是追加写入:
bash
>> "$LOG_FILE"
不过日志文件会逐渐变大,所以脚本中加入了日志大小判断:
bash
超过 5MB 自动清空
十五、最终执行流程总结
完整操作流程如下:
bash
vim /home/kylin/clean_bin.sh
sed -i 's/\r$//' /home/kylin/clean_bin.sh
sudo chmod +x /home/kylin/clean_bin.sh
sudo /home/kylin/clean_bin.sh
sudo cat /home/kylin/xx/clear_old_bin.log
sudo crontab -e
sudo crontab -l
sudo crontab -e 中最终添加:
bash
@reboot /home/kylin/clean_bin.sh
0 1 * * * /home/kylin/clean_bin.sh
十六、结论
通过 Shell 脚本配合 crontab,可以在 Kylin 系统中稳定实现 .bin 文件自动清理。
本方案具备以下特点:
text
1. 按文件修改时间判断是否超过 7 天
2. 只删除 .bin 文件,避免误删其他文件
3. 只清理 /home/kylin/xx 当前目录,不进入子目录
4. xx 目录不存在时自动忽略
5. 日志记录删除情况,便于排查
6. 日志超过 5MB 自动清空
7. 使用 flock 防止脚本重复执行
8. 使用 root crontab,解决 root 文件无法删除的问题
9. 支持开机后自动执行
10. 支持每天凌晨 1 点自动执行
对于长期运行的设备或测试环境,这种方式简单、稳定、维护成本低。