Linux 定时任务入门:用 crontab 写出不踩坑的计划任务

举报
yd_225736217 发表于 2026/11/02 15:11:02 2026/11/02
【摘要】 在服务器上定期备份数据库、清理日志、拉取报表,最常用的工具就是 cron。它几乎所有 Linux 发行版都自带,配置只需要一行。不过很多人第一次写 crontab 时会遇到“手动执行没问题,定时却不跑”的情况。本文从语法讲起,再总结几个最常见的坑。一、crontab 的基本语法用 crontab -e 编辑当前用户的计划任务,每行由五个时间字段加一条命令组成,依次是分钟、小时、日、月、星期。...

在服务器上定期备份数据库、清理日志、拉取报表,最常用的工具就是 cron。它几乎所有 Linux 发行版都自带,配置只需要一行。不过很多人第一次写 crontab 时会遇到“手动执行没问题,定时却不跑”的情况。本文从语法讲起,再总结几个最常见的坑。

一、crontab 的基本语法

用 crontab -e 编辑当前用户的计划任务,每行由五个时间字段加一条命令组成,依次是分钟、小时、日、月、星期。

# 每天凌晨 2:30 备份数据库
30 2 * * * /home/app/bin/backup.sh

# 工作日每小时的第 0 分钟检查一次服务
0 * * * 1-5 /home/app/bin/check.sh

# 每 15 分钟同步一次
*/15 * * * * /home/app/bin/sync.sh

星号表示“每个”,逗号表示列举,短横线表示范围,斜杠表示间隔。写完后可以用 crontab -l 查看是否保存成功。

二、坑一:环境变量不一样

cron 执行命令时使用的是一个非常精简的环境,PATH 往往只有 /usr/bin 和 /bin,也不会加载 .bashrc。手动能运行的脚本,在 cron 里可能找不到 python、node 等命令。解决办法是在脚本里使用绝对路径,或者在 crontab 顶部显式写上 PATH,例如 PATH=/usr/local/bin:/usr/bin:/bin。

三、坑二:没有输出就不知道失败

默认情况下,cron 任务的输出会尝试以邮件形式发送,大多数服务器没有配置邮件,结果就是错误信息直接丢失。建议把输出重定向到日志文件:

30 2 * * * /home/app/bin/backup.sh >> /var/log/backup.log 2>&1

排查时还可以查看系统日志,确认 cron 是否真的触发了任务,例如 grep CRON /var/log/syslog 或 journalctl -u cron。

四、坑三:任务重叠执行

如果一个每 5 分钟执行的任务某次跑了 8 分钟,下一次就会和它同时运行,可能导致数据重复写入。可以用 flock 加一把文件锁,保证同一时刻只有一个实例:

*/5 * * * * flock -n /tmp/sync.lock /home/app/bin/sync.sh

五、坑四:时区与百分号

cron 使用的是系统时区,云服务器默认可能是 UTC,写“每天 8 点”时要先用 timedatectl 确认时区。另外,crontab 里的百分号有特殊含义,用 date 生成文件名时要写成 \%Y\%m\%d。

六、小结

写好一条定时任务,记住四点:使用绝对路径、输出写日志、防止重叠、确认时区。任务多起来之后,也可以考虑改用 systemd timer 或云上的定时触发器,统一管理和告警。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。