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。
- 时间错乱:检查时区与时间同步。


练习(建议完成)#

  1. 使用 cron 每 5 分钟写入一次 date/tmp/cron_test.log
  2. 使用 at 设置 1 小时后执行 df -h 并写入日志。
  3. 用 systemd timer 创建每晚 23:30 的日志清理任务,验证 systemctl list-timers 输出。

使用原则(落地版)#

  • 幂等性:脚本可重复执行不出错(如使用 mkdir -p)。
  • 资源窗口:高负载任务错开业务高峰。
  • 可观测:统一日志输出与错误捕获。
  • 权限最小化:非必要不以 root 运行。
  • 变更纳管:脚本纳入版本管理,避免“临时命令漂移”。