定时任务与调度(Cron & Scheduling)
v1.0.0使用 cron 和 systemd 定时器来安排和管理重复任务。在设置 cron 作业、编写 systemd 定时器单元、处理时区感知调度、监控失败的作业、实现重试模式或调试为什么安排的任务没有运行时使用。
运行时依赖
安装命令
点击复制技能文档
Cron & 计划调度 计划和管理重复任务。涵盖cron语法,crontab管理,systemd定时器,一次性调度,时区处理,监控和常见失败模式。
何时使用
- 按照计划运行脚本(备份,报告,清理)
- 设置systemd定时器(现代cron替代品)
- 调试计划任务未运行的原因
- 处理计划任务中的时区
- 监控和警报作业失败
- 运行一次性延迟命令
Cron 语法 五个字段 ┌───────── 分钟(0-59) │ ┌─────── 小时(0-23) │ │ ┌───── 月份中的某一天(1-31) │ │ │ ┌─── 月份(1-12 或 JAN-DEC) │ │ │ │ ┌─ 周中的某一天(0-7,0 和 7 = 星期日,或 SUN-SAT) │ │ │ │ │ 命令
常见计划
- 每分钟
- 每 5 分钟
- 每小时的 00 分
- 每天 2:30 AM
- 每周一 9:00 AM
- 每周日 8:00 AM
- 每月第一天午夜
- 工作时间(周一至周五 9-17)每 15 分钟
- 每天两次(9 AM 和 5 PM)
- 每个季度(1 月,4 月,7 月,10 月)第一天午夜
- 每周日 3 AM
特殊字符串(简写) @reboot /path/to/script.sh # 启动时运行一次 @yearly /path/to/script.sh # 0 0 1 1 @monthly /path/to/script.sh # 0 0 1 @weekly /path/to/script.sh # 0 0 0 @daily /path/to/script.sh # 0 0 @hourly /path/to/script.sh # 0
Crontab 管理
- 编辑当前用户的 crontab
- 列出当前 crontab
- 编辑其他用户的 crontab(root)
- 删除所有 cron 作业(小心!)
- 从文件安装 crontab
- 备份 crontab
Crontab 最佳实践
- 明确设置 PATH(cron 有最小 PATH)
- 设置 MAILTO 以接收错误通知
- 明确设置 shell
- 完整 crontab 示例
Systemd 定时器 创建定时器(现代 cron 替代品) # /etc/systemd/system/backup.service [Unit] Description=每日备份 [Service] Type=oneshot ExecStart=/opt/scripts/backup.sh User=backup StandardOutput=journal StandardError=journal # /etc/systemd/system/backup.timer [Unit] Description=每日 2 AM 运行备份 [Timer] OnCalendar=-- 02:00:00 Persistent=true RandomizedDelaySec=300 [Install] WantedBy=timers.target
- 启用和启动定时器
- 检查定时器状态
- 检查最后一次运行
- 手动运行(用于测试)
- 禁用定时器
OnCalendar 语法
- 每日午夜
- 或:OnCalendar=-- 00:00:00
- 每周一 9 AM
- 每 15 分钟
- 周日 8 AM
- 每月第一天午夜
- 每 6 小时
- 特定日期
- 测试日历表达式
与 cron 的优势
- 日志记录在 journald 中(journalctl -u 服务名称)
- 持久:在重启后捕获错过的运行
- RandomizedDelaySec:防止雷鸣群
- 依赖项:可以依赖于网络,安装等
- 资源限制:CPUQuota,MemoryMax 等
- 没有丢失电子邮件问题(MAILTO 经常配置错误)
- 更多文件需要创建(服务 + 定时器)
- 配置更冗长
一次性调度 at(在特定时间运行一次)
- 安排命令
- 交互式(输入命令,Ctrl+D 完成)
/opt/scripts/task.sh
echo "Done" | mail -s "Task complete" admin@example.com
- 列出待处理作业
- 查看作业详细信息
- 删除作业
- 运行某事物后延迟(sleep 3600 && /opt/scripts/task.sh)&
- 使用 nohup(在注销后幸存)