cron 任务调度(最常用)
原理:通过守护进程crond
周期性执行任务。
适用场景:需要按固定周期(分钟/小时/天等)重复执行的任务。
操作步骤:
-
编辑用户级定时任务
crontab -e # 编辑当前用户的任务
在打开的文件中添加规则(每行一个任务):
# 格式:分 时 日 月 周 <命令> * * * * * /path/to/script.sh # 每分钟执行 0 3 * * * /backup.sh # 每天凌晨3点执行 30 15 * * 1-5 /send_report.sh # 每周一至五下午15:30执行
-
系统级定时任务
管理员可将脚本放入以下目录:/etc/cron.hourly/ # 每小时 /etc/cron.daily/ # 每天 /etc/cron.weekly/ # 每周 /etc/cron.monthly/ # 每月
-
查看与调试
crontab -l # 列出当前任务 tail -f /var/log/cron # 查看执行日志
at 单次任务调度
原理:在指定时间点执行一次性任务。
适用场景:计划关机、临时备份等单次任务。
操作步骤:
-
安装 at 工具
sudo apt install at # Debian/Ubuntu sudo yum install at # CentOS/RHEL
-
创建任务
at 14:30 2025-12-31 # 指定时间 at> /path/to/script.sh at> Ctrl+D # 保存退出
-
管理任务
atq # 查看队列 atrm <任务ID> # 删除任务
systemd Timer(现代系统推荐)
原理:通过.timer
单元控制.service
单元的执行时间。
适用场景:需要依赖系统启动、精确到秒的定时任务。
操作步骤:
-
创建服务单元(如
/etc/systemd/system/backup.service
)[Unit] Description=Backup Script [Service] ExecStart=/usr/local/bin/backup.sh
-
创建定时器单元(如
/etc/systemd/system/backup.timer
)[Unit] Description=Run backup daily [Timer] OnCalendar=*-*-* 03:00:00 # 每天3点执行 Persistent=true # 补执行错过的任务 [Install] WantedBy=timers.target
-
启用并启动
sudo systemctl daemon-reload sudo systemctl enable --now backup.timer
-
检查状态
systemctl list-timers # 查看所有定时器 journalctl -u backup.service # 查看日志
sleep 或 while 循环(脚本内定时)
原理:在脚本中使用sleep
控制执行间隔。
适用场景:简单轮询任务(如每10秒检测服务)。
示例脚本:
/path/to/monitor.sh # 执行任务 sleep 300 # 休眠300秒(5分钟) done
选择建议
方法 | 执行周期 | 精度 | 复杂度 |
---|---|---|---|
cron | 周期性 | 分钟级 | 低 |
at | 单次 | 分钟级 | 低 |
systemd timer | 周期/单次 | 秒级 | 中 |
sleep 循环 | 短周期轮询 | 秒级 | 高(需手动管理) |
安全与最佳实践
-
权限控制
- 使用
crontab -e
而非直接编辑/etc/crontab
避免权限错误。 - 限制
at
使用权限:编辑/etc/at.deny
和/etc/at.allow
。
- 使用
-
日志记录
- 在脚本中重定向输出:
* * * * * /script.sh >> /var/log/script.log 2>&1
- 对
systemd
服务启用日志:journalctl -u service_name
- 在脚本中重定向输出:
-
环境变量问题
- cron任务需指定完整路径(如
/usr/bin/python3
),或在脚本开头设置PATH
。
- cron任务需指定完整路径(如
-
资源监控
- 避免高频任务耗尽资源,使用
systemd
的CPUQuota
限制CPU占用。
- 避免高频任务耗尽资源,使用
常见错误排查
- 任务未执行:检查
crond
或atd
服务状态:systemctl status cron
。 - 权限不足:确保脚本有执行权限(
chmod +x script.sh
)。 - 路径错误:在脚本中使用绝对路径,或在cron中设置
PATH
变量。 - 时间配置错误:使用工具验证时间格式(如
crontab.guru
在线验证)。
引用说明:
- cron 语法参考:Linux
man 5 crontab
- systemd timer 官方文档:freedesktop.org – systemd.timer
- at 命令手册:Linux
man at
基于Linux内核5.4+及systemd 245+版本验证,适用于主流发行版(Ubuntu 20.04+, CentOS 8+)。*
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/5532.html