
Linux 中的定时任务主要靠 cron 系统实现,而 crontab 是管理用户级定时任务的核心命令。注意:没有标准的 at 命令与 crontab 混用为“crontabat” ——这是常见误解。at 用于**一次性**延时任务,crontab 用于**周期性**重复任务,二者机制不同、配置独立。
crontab:设置周期性定时任务
每个用户(包括 root)都有自己的 crontab 文件,通过 crontab -e 编辑,内容按固定时间格式定义任务执行计划。
- 时间字段顺序为:分 时 日 月 周 命令(共 6 字段),例如
30 2 * * * /backup.sh表示每天凌晨 2:30 执行脚本 - 支持符号:*(任意值)、,(列举)、-(范围)、/(步长),如
0 9-17/2 * * 1-5表示工作日每两小时(9、11、13、15、17 点)整点运行 - 编辑保存后自动加载,无需重启服务;可用
crontab -l查看,crontab -r清空(慎用) - 命令中涉及路径、环境变量时建议写绝对路径,并显式指定 SHELL 和 PATH,避免因 cron 环境精简导致执行失败
at:安排单次延迟执行任务
at 适合执行一次性的未来任务,比如“今晚 23:00 关机”或“10 分钟后发邮件”。它不依赖 cron 守护进程持续调度,而是由 atd 后台服务管理队列。
- 使用前确认
atd已启用:sudo systemctl enable --now atd - 输入
at 23:00回车后,进入交互模式,输入要执行的命令(如shutdown -h now),按 Ctrl+D 结束 - 查看待执行任务:
atq;取消某任务:atrm [job_id] - 注意:
at默认使用用户当前 shell 环境,但不读取 ~/.bashrc 等文件,复杂命令建议封装为脚本并用绝对路径调用
常见问题与调试技巧
定时任务“看似添加成功却没运行”是高频痛点,多数源于环境差异或权限配置。
- 检查 cron 是否运行:
systemctl status cron(Debian/Ubuntu)或systemctl status crond(RHEL/CentOS) - 查看系统 cron 日志:
grep CRON /var/log/syslog(Ubuntu)或journalctl -u cron -n 20 - 在 crontab 中重定向输出便于排查:
* * * * * /path/to/script.sh >> /tmp/script.log 2>&1 - 测试命令是否能在 cron 环境下运行:切换到对应用户,用
env -i /bin/sh模拟最小环境再执行命令
安全与最佳实践
不当配置可能引发权限泄露或系统负载异常,尤其在生产环境中需谨慎。
- 避免在 root 的 crontab 中直接写敏感操作;优先用普通用户 + sudo(需配置免密)方式降低风险
- 不要把密码、密钥写在脚本或 crontab 行内;改用配置文件 + 权限控制(如
chmod 600) - 对关键任务加锁防重复执行(如用
flock):* * * * * flock -n /tmp/myjob.lock -c "/path/to/script.sh" - 定期审计定时任务:
for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l 2>/dev/null; done










