1.7.1 计划任务概述与应用场景
计划任务概述与应用场景#
计划任务用于在指定时间或周期自动执行命令/脚本,典型实现包括 cron(周期)、at(一次性)与 systemd timer(现代定时器)。本节聚焦概念、原理与可执行示例,便于快速上手与理解应用边界。
原理草图(任务调度链路)
核心价值与典型场景(附示例)#
1)备份与归档(周期任务)
# 备份脚本示例:/opt/backup/db_backup.sh
#!/bin/bash
set -euo pipefail
DATE=$(date +%F)
BACKUP_DIR=/data/backup
mkdir -p "$BACKUP_DIR"
# 说明:mysqldump 为 MySQL 逻辑备份,输出重定向到文件
mysqldump -uroot -p'Passw0rd' --single-transaction --routines --events mydb \
> "$BACKUP_DIR/mydb_$DATE.sql"
# 说明:压缩并保留7天
gzip -f "$BACKUP_DIR/mydb_$DATE.sql"
find "$BACKUP_DIR" -type f -name "*.gz" -mtime +7 -delete
echo "backup done: $DATE"
2)日志清理(低峰期)
# 清理 30 天前日志(示例)
find /var/log -type f -name "*.log" -mtime +30 -print -delete
3)巡检与监控(定时采集)
# 简单健康检查:检查 Nginx 端口
nc -zv 127.0.0.1 80 && echo "nginx ok" || echo "nginx down"
关键命令与配置示例(可直接运行)#
A. cron 周期任务
# 查看当前用户的计划任务
crontab -l
# 编辑任务(示例:每天 02:00 备份)
crontab -e
# crontab 内容示例(每天 02:00 执行备份)
0 2 * * * /opt/backup/db_backup.sh >> /var/log/db_backup.log 2>&1
命令解释:
- 0 2 * * *:每天 02:00
- >> /var/log/db_backup.log:追加日志
- 2>&1:标准错误合并到日志
B. at 一次性任务
# 安装(如未安装)
# RHEL/CentOS
sudo yum -y install at
# Ubuntu/Debian
sudo apt -y install at
# 设定一次性任务:10 分钟后执行
echo "/usr/bin/uptime >> /tmp/at_test.log" | at now + 10 minutes
# 查看队列
atq
# 删除任务(按任务 ID)
atrm 3
C. systemd timer(现代定时器)
# 安装 systemd 通常默认存在,可直接使用
# 创建服务单元:/etc/systemd/system/backup.service
[Unit]
Description=DB Backup Service
[Service]
Type=oneshot
ExecStart=/opt/backup/db_backup.sh
# 创建定时器:/etc/systemd/system/backup.timer
[Unit]
Description=Run DB Backup Daily
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
# 启用并启动定时器
sudo systemctl daemon-reload
sudo systemctl enable --now backup.timer
sudo systemctl list-timers --all | grep backup
安装与环境准备(通用建议)#
# 确保计划任务依赖的脚本可执行
chmod +x /opt/backup/db_backup.sh
# 确保 PATH 与权限(避免定时任务找不到命令)
which mysqldump
常见排错(快速定位)#
# 1) cron 是否运行(不同发行版服务名可能为 cron/crond)
systemctl status crond
systemctl status cron
# 2) 查看 cron 日志(Debian/Ubuntu)
grep CRON /var/log/syslog | tail -n 20
# 3) RHEL/CentOS
grep CRON /var/log/cron | tail -n 20
# 4) 手工执行脚本验证环境
/opt/backup/db_backup.sh
排错要点:
- PATH 不一致:在脚本内使用绝对路径,或在脚本头部设置 PATH。
- 权限不足:使用最小权限账号,必要时配置 sudo。
- 输出无日志:务必重定向 stdout/stderr。
- 时间错乱:检查时区与时间同步。
练习(建议完成)#
- 使用 cron 每 5 分钟写入一次
date到/tmp/cron_test.log。 - 使用 at 设置 1 小时后执行
df -h并写入日志。 - 用 systemd timer 创建每晚 23:30 的日志清理任务,验证
systemctl list-timers输出。
使用原则(落地版)#
- 幂等性:脚本可重复执行不出错(如使用
mkdir -p)。 - 资源窗口:高负载任务错开业务高峰。
- 可观测:统一日志输出与错误捕获。
- 权限最小化:非必要不以 root 运行。
- 变更纳管:脚本纳入版本管理,避免“临时命令漂移”。