Linux cron 定时任务入门:从第一条定时任务到避坑清单

举报
yd_222406226 发表于 2026/11/01 14:26:28 2026/11/01
【摘要】 在服务器上,有很多活不需要人守着:每天凌晨备份一次、每小时清理一次临时文件、每周生成一份报表。这些“到点就干”的活,Linux 里一般交给 cron。它由两部分组成:常驻后台的 cron 守护进程,和每位用户自己的任务表 crontab。守护进程每分钟醒来一次,对照任务表决定该不该执行,执行结果按配置发邮件或写日志。时间表达式是 cron 的核心,一行任务的前五个字段依次是分、时、日、月、周...

在服务器上,有很多活不需要人守着:每天凌晨备份一次、每小时清理一次临时文件、每周生成一份报表。这些“到点就干”的活,Linux 里一般交给 cron。它由两部分组成:常驻后台的 cron 守护进程,和每位用户自己的任务表 crontab。守护进程每分钟醒来一次,对照任务表决定该不该执行,执行结果按配置发邮件或写日志。
时间表达式是 cron 的核心,一行任务的前五个字段依次是分、时、日、月、周。星号表示“每个都算”,斜杠表示步长,逗号表示枚举,横杠表示范围。比如 0 2 * * * 是每天凌晨 2 点,*/10 * * * * 是每 10 分钟一次,0 9 * * 1-5 是工作日上午 9 点。第六个字段起才是要执行的命令。周字段里 0 和 7 都表示周日,写任务时注意不要把“日”和“周”理解成“且”的关系——两者是“或”,即日期或星期任一满足就会触发。
写第一条任务很简单:执行 crontab -e 打开当前用户的任务表,加上一行并保存。比如每天凌晨 2 点半打包备份网站目录:30 2 * * * tar -czf /backup/site-$(date +\%Y\%m\%d).tar.gz /var/www/site。注意命令里的百分号在 crontab 里有特殊含义,必须转义成 \%,否则它会被当成换行符。
新手最容易踩的坑有五个。第一是环境变量:cron 执行时的 PATH 很短,也不会加载你的 shell 配置,脚本里用到的命令最好写绝对路径,或者在脚本开头自己 export PATH。第二是输出无处去:命令的标准输出默认发邮件,服务器没配邮件就会丢掉,调试期建议把输出重定向到日志文件,比如 >> /var/log/backup.log 2>&1。第三是权限与工作目录:cron 的工作目录是用户家目录,脚本里用相对路径很容易跑偏,路径一律写绝对。第四是改了不生效:确认 cron 服务在运行(systemctl status cron 或 crond),并用 crontab -l 检查任务确实保存进去了。第五是时区:cron 按系统时区执行,云服务器默认往往是 UTC,执行时间比北京时间晚 8 小时,写任务前先用 date 确认系统时间。
任务重叠也值得留意:如果一条任务执行时间比周期长,下一次到点时上一次还没跑完,两个进程会同时跑。简单办法是在脚本开头用 flock 加锁,或者把周期放宽。调试时有三板斧:先看系统日志里有没有这条任务的执行记录,再看自己重定向的日志文件有没有报错,最后把命令原样粘到终端手动跑一遍——九成问题在手动跑的时候就现形了。
最后给一份上手清单:先 date 确认时区,再 crontab -e 写任务,命令用绝对路径,输出重定向到日志,保存后 crontab -l 复核,次日看日志确认真的跑起来了。掌握这套流程,定时备份、日志轮转、缓存清理这些日常活,就可以放心交给 cron 了。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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