【ubuntu下小工具】Crontab定时任务进行数据备份和清理

背景

在生产环境的深度学习项目中,系统每日会持续生成大量数据。如果不进行有效管理,随着时间的推移,磁盘空间将被占满,最终导致服务器瘫痪。 为解决这一问题,需设置一个定时任务去执行脚本,用以完成:

  1. 按日归档数据:将每日生成的数据存入以日期命名的独立文件夹中。
  2. 定期清理历史数据 :仅保留最近 n 天的数据文件夹,自动删除更早的历史数据,确保磁盘空间合理利用。

该方案通过定时任务实现,既能保证数据的阶段性存储,又能避免因磁盘写满引发的服务中断。

1. 执行文件的编写

  1. DATASET文件夹,移动到DATASET_BACKUP路径下,并重新创建 DATASET文件夹,用以后续的数据存放。
  2. DATASET_BACKUP 路径下的归档数据,保留最近 n 个数据文件夹,其余均删除。
bash 复制代码
#!/bin/bash

# 配置部分

SOURCE_DIR="/home/ll/crontab_task/testdata/DATASET"         # 需要归档数据
BACKUP_DIR="/home/ll/crontab_task/testdata/DATASET_BACKUP"  # 归档路劲
LOGS_DIR="/home/ll/crontab_task/testdata/image_backup.log"  # 归档日志

DEFAULT_KEEP_COUNT=5  # 默认保留最近的5个备份

# 检查源目录
if [ ! -d "$SOURCE_DIR" ]; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 源目录 $SOURCE_DIR 不存在,跳过备份" >> $LOGS_DIR
    exit 0
fi

# 从SOURCE_DIR提取最后一级目录名
BASE_NAME=$(basename "$SOURCE_DIR")

# 获取原始权限信息
ORIG_OWNER=$(stat -c "%U:%G" "$SOURCE_DIR")
ORIG_PERM=$(stat -c "%a" "$SOURCE_DIR")

# mv操作
DATETIME=$(date +"%Y%m%d_%H%M")
mkdir -p "$BACKUP_DIR"
mv "$SOURCE_DIR" "${BACKUP_DIR}/${BASE_NAME}_${DATETIME}" || {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 备份失败!目录可能被锁定或磁盘已满" >> "$LOGS_DIR"
    exit 1
}

# 重建目录并恢复权限
mkdir -p "$SOURCE_DIR"
chown "$ORIG_OWNER" "$SOURCE_DIR"
chmod "$ORIG_PERM" "$SOURCE_DIR"
echo "$(date '+%Y-%m-%d %H:%M:%S') - 已重建目录并恢复权限: $ORIG_OWNER $ORIG_PERM" >> "$LOGS_DIR"

# 删除旧备份(保留最近的KEEP_COUNT个)
KEEP_COUNT=${1:-$DEFAULT_KEEP_COUNT}
BACKUP_FILES=($(ls -dt "${BACKUP_DIR}/${BASE_NAME}_"* 2>/dev/null))
TOTAL_COUNT=${#BACKUP_FILES[@]}

if [ $TOTAL_COUNT -gt $KEEP_COUNT ]; then
    for (( i=KEEP_COUNT; i<TOTAL_COUNT; i++ )); do
        rm -rf "${BACKUP_FILES[$i]}"
    done
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 保留最近 ${KEEP_COUNT} 个备份,删除 $((TOTAL_COUNT - KEEP_COUNT)) 个旧备份" >> "$LOGS_DIR"
fi

OK,脚本实现了后。我们需要设置和开启定时任务。

2 Crontab 定时任务的设置

  1. 打开终端运行

    bash 复制代码
    crontab -e
  2. 然后添加内容

    bash 复制代码
    * * * * * /home/ll/crontab_task/images_data_backup.sh   # 每分钟备份一次
    # 0 2 * * * /home/ll/crontab_task/images_data_backup.sh   # 每天2点0分执行sh文件
  3. 查看当前用户的定时任务

    bash 复制代码
    crontab -l

以上设置,定时任务已经设置成功,并在指定时间执行。

3 Crontab 详细介绍

这里做个记录,方便自己快速查阅。如果有更多的需求和疑问,直接deepseek一下,会得到更为详细的答案。

crontabCron Table )是 Linux/Unix 系统中的一个 定时任务管理工具 ,允许用户按预定义的时间周期自动执行命令或脚本。它由 cron 守护进程(crond)驱动,广泛用于自动化运维、日志清理、数据备份等场景。


2.1 Crontab 基本结构

一个 crontab 条目由 时间表达式 + 要执行的命令 组成,格式如下:

bash 复制代码
* * * * * <command-to-execute>
│ │ │ │ │
│ │ │ │ └─── 星期几 (0-7, 0和7都代表周日)
│ │ │ └───── 月份 (1-12)
│ │ └─────── 日期 (1-31)
│ └───────── 小时 (0-23)
└─────────── 分钟 (0-59)

示例:

bash 复制代码
*/5 * * * * /path/to/script.sh  # 每5分钟执行一次脚本
30 3 * * * /backup.sh          # 每天凌晨3:30执行备份
0 0 1 * * /clean-logs.sh       # 每月1日0:00清理日志

2.2 Crontab 时间表达式详解

  • (1)基本时间字段

    字段 取值范围 说明
    分钟 0-59 每小时的第几分钟执行
    小时 0-23 每天的第几小时执行
    日期 1-31 每月的第几天执行
    月份 1-12 每年的第几月执行
    星期 0-7 每周的第几天执行(0和7=周日)
  • (2)特殊符号

    符号 示例 说明
    * * * * * * 匹配所有可能值(每分钟执行)
    , 0,15,30 * * * * 指定多个时间点(每小时的0,15,30分执行)
    - 0 9-18 * * * 时间范围(每天9点到18点整点执行)
    */n */5 * * * * 每隔n单位执行一次(每5分钟执行)
  • (3)常见示例

    表达式 说明
    0 * * * * 每小时的第0分钟(整点)执行
    */10 * * * * 每10分钟执行一次
    0 2 * * * 每天凌晨2点执行
    0 0 * * 0 每周日0点执行
    0 0 1 * * 每月1日0点执行

3. Crontab 基本操作

  1. 查看当前用户的定时任务

    bash 复制代码
    crontab -l
  2. 编辑定时任务

    bash 复制代码
    crontab -e  # 使用默认编辑器(如vi)修改
  3. 删除所有定时任务

    bash 复制代码
    crontab -r
  4. 指定用户管理(需root权限)

    bash 复制代码
    crontab -u username -e  # 编辑其他用户的crontab

4. Crontab 注意事项

在设置定时任务时候,无论脚本还是Crontab 中的执行脚本,都需要是绝对路径。