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

背景

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

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

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

1. 执行文件的编写

  1. DATASET文件夹,移动到DATASET_BACKUP路径下,并重新创建 DATASET文件夹,用以后续的数据存放。
  2. DATASET_BACKUP 路径下的归档数据,保留最近 n 个数据文件夹,其余均删除。
    在这里插入图片描述
#!/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. 打开终端运行
    crontab -e
    
  2. 然后添加内容
    * * * * * /home/ll/crontab_task/images_data_backup.sh   # 每分钟备份一次
    # 0 2 * * * /home/ll/crontab_task/images_data_backup.sh   # 每天2点0分执行sh文件
    
  3. 查看当前用户的定时任务
    crontab -l
    

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

3 Crontab 详细介绍

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

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


2.1 Crontab 基本结构

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

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

示例:

*/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. 查看当前用户的定时任务

    crontab -l
    
  2. 编辑定时任务

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

    crontab -r
    
  4. 指定用户管理(需root权限)

    crontab -u username -e  # 编辑其他用户的crontab
    

4. Crontab 注意事项

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值