Kylin 系统下使用 Shell 脚本定期清理历史文件

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 点自动执行

对于长期运行的设备或测试环境,这种方式简单、稳定、维护成本低。

相关推荐
钝挫力PROGRAMER7 小时前
Kylin V10 安装 MySQL 8.0 后无法通过 127.0.0.1 连接
mysql·kylin
技术小结-李爽8 小时前
【工具】Shell之Bash、Zsh配置文件的使用
开发语言·bash
烁3471 天前
shell简单脚本语法
bash
承渊政道2 天前
【MySQL数据库学习】MySQL基本查询(下)
数据库·学习·mysql·leetcode·bash·数据库开发·数据库系统
ziyitty3 天前
解决Windows下Bash调用Python输出中文乱码的问题
windows·python·bash
一碗白开水一3 天前
【训练技巧】bash: conda: command not found:conda 没有适配环境
开发语言·conda·bash
utf8mb4安全女神4 天前
怎么写shell/bash脚本【if嵌套】【case】【while死循环】【while嵌套if】【for】【随机数】
开发语言·bash
shandianchengzi4 天前
【记录】VSCode|Windows 下 VS Code 配置 Git Bash 为默认终端完整教程
windows·git·vscode·bash
承渊政道4 天前
【MySQL数据库学习】MySQL基本查询(上)
linux·数据库·学习·mysql·bash·数据库开发·数据库系统