Linux计划任务管理包含cron(周期性)、at(一次性)和systemd timer(现代化替代)三大工具:cron通过crontab按分钟级时间表达式执行重复任务;at依赖atd服务在指定时间点执行单次任务;systemd timer为较新方案,但cron仍是运维事实标准。

cron 是 Linux 中最常用、最可靠的计划任务工具,但直接用 crontab -e 编辑容易出错,尤其在路径、环境变量、权限这几块栽跟头。别急着敲命令,先确认你真正需要的是周期性任务(比如每天备份),还是一次性任务(比如两小时后重启服务)——选错工具,后面全白搭。
用 cron 还是 at?先分清场景
周期性重复执行(每分钟、每天、每周)→ 用 cron;只跑一次、时间点明确(比如“今晚 23:45 清空缓存”)→ 用 at。
at 需要 atd 服务运行:systemctl start atd 且 systemctl enable atd;cron 通常默认启用,但建议检查:systemctl is-active crond(RHEL/CentOS)或 systemctl is-active cron(Debian/Ubuntu)。
- 误用
at做每日任务:它不会自动重装,执行完就消失 - 误用
cron做单次任务:会不断触发,除非手动删掉那条规则 - systemd timer 虽然更现代,但多数运维场景仍以
cron为事实标准,别为了“新”而换
cron 时间表达式里最容易写错的三处
格式是 分钟 小时 日 月 星期 命令,五个时间字段,缺一不可。常见错误不是语法错,而是语义误解:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
0 2 * * 1表示“每周一凌晨 2 点”,不是“每周一的第 2 天”——星期字段是 0–7(0 和 7 都是周日),不是 1–7 -
*/10 * * * *是“每 10 分钟”,但很多人写成10 * * * *,结果变成“每小时第 10 分钟执行一次” - 想“每月 1 号和 15 号”执行,写成
0 3 1,15 * *;若写成0 3 1-15 * *,就会每天 1 号到 15 号都跑
命令能执行,但没反应?多半是环境问题
cron 默认使用最小化 shell 环境(通常是 /bin/sh),不加载你的 ~/.bashrc 或 PATH。所以:
- 脚本里调用的命令(如
python3、mysqldump)必须写绝对路径,查路径用which python3 - 脚本开头加
#!/usr/bin/env bash没用——cron不管 shebang,它只认你写在 crontab 里的 shell - 最好显式设置环境:
PATH=/usr/local/bin:/usr/bin:/bin写在 crontab 文件顶部(在第一行命令前) - 调试时加日志:
0 3 * * * /path/to/script.sh >> /var/log/myscript.log 2>&1
别用 crontab -e 直接改,尤其线上环境
编辑器意外退出、误按 :wq! 强制保存、手抖删掉整行——这些都会让整个用户的 crontab 失效。稳妥做法是:
- 把任务写进独立文件,比如
backup.cron,内容只有这一行:0 3 * * * /opt/scripts/backup.sh - 用
crontab backup.cron替换全部任务(不是追加) - 先用
crontab -l确认当前内容,再操作 - 所有修改必须带注释说明用途和时间,比如:
# 2026-07-09: DB backup, runs daily at 03:00
真正麻烦的从来不是怎么设,而是某天发现任务没跑、日志为空、又找不到谁动过 crontab —— 所以每次变更,都要留痕、验证、记录。

















