【ubuntu下小工具】Crontab定时任务进行数据备份和清理
背景
在生产环境的深度学习项目中,系统每日会持续生成大量数据。如果不进行有效管理,随着时间的推移,磁盘空间将被占满,最终导致服务器瘫痪。 为解决这一问题,需设置一个定时任务去执行脚本,用以完成:
- 按日归档数据:将每日生成的数据存入以日期命名的独立文件夹中。
- 定期清理历史数据:仅保留最近 n 天的数据文件夹,自动删除更早的历史数据,确保磁盘空间合理利用。
该方案通过定时任务实现,既能保证数据的阶段性存储,又能避免因磁盘写满引发的服务中断。
1. 执行文件的编写
- 将
DATASET
文件夹,移动到DATASET_BACKUP
路径下,并重新创建DATASET
文件夹,用以后续的数据存放。- 将
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" ]; thenecho "$(date '+%Y-%m-%d %H:%M:%S') - 源目录 $SOURCE_DIR 不存在,跳过备份" >> $LOGS_DIRexit 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 ]; thenfor (( i=KEEP_COUNT; i<TOTAL_COUNT; i++ )); dorm -rf "${BACKUP_FILES[$i]}"doneecho "$(date '+%Y-%m-%d %H:%M:%S') - 保留最近 ${KEEP_COUNT} 个备份,删除 $((TOTAL_COUNT - KEEP_COUNT)) 个旧备份" >> "$LOGS_DIR" fi
OK,脚本实现了后。我们需要设置和开启定时任务。
2 Crontab 定时任务的设置
- 打开终端运行
crontab -e
- 然后添加内容
* * * * * /home/ll/crontab_task/images_data_backup.sh # 每分钟备份一次 # 0 2 * * * /home/ll/crontab_task/images_data_backup.sh # 每天2点0分执行sh文件
- 查看当前用户的定时任务
crontab -l
以上设置,定时任务已经设置成功,并在指定时间执行。
3 Crontab 详细介绍
这里做个记录,方便自己快速查阅。如果有更多的需求和疑问,直接deepseek一下,会得到更为详细的答案。
crontab
(Cron 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 基本操作
查看当前用户的定时任务
crontab -l
编辑定时任务
crontab -e # 使用默认编辑器(如vi)修改
删除所有定时任务
crontab -r
指定用户管理(需root权限)
crontab -u username -e # 编辑其他用户的crontab
4. Crontab 注意事项
在设置定时任务时候,无论脚本还是Crontab 中的执行脚本,都需要是绝对路径。