定时任务总靠手动跑?crontab 一次讲清

举报
yd_265618206 发表于 2026/10/27 12:52:03 2026/10/27
【摘要】 定时任务总靠手动跑?crontab 一次讲清每天凌晨手动备份数据库、每周手动清理一次日志、每月手动重启一次服务——这些重复活,交给 crontab 就行。它是 Linux 自带的定时任务工具,学会 5 个字段的写法,就能让服务器自己按时干活。 一、crontab 的时间怎么写一条定时任务长这样:30 2 * * * /home/opc/backup.sh >> /var/log/backu...

定时任务总靠手动跑?crontab 一次讲清

每天凌晨手动备份数据库、每周手动清理一次日志、每月手动重启一次服务——这些重复活,交给 crontab 就行。它是 Linux 自带的定时任务工具,学会 5 个字段的写法,就能让服务器自己按时干活。

一、crontab 的时间怎么写

一条定时任务长这样:

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

前面 5 个字段依次是:分 时 日 月 星期。上面这行意思是每天凌晨 2:30 执行一次备份脚本,输出追加到日志里。

几个常用写法:

0 9 * * 1-5 /home/opc/report.sh      # 工作日早上 9 点
*/10 * * * * /home/opc/health.sh     # 每 10 分钟一次
0 0 1 * * /home/opc/monthly.sh       # 每月 1 号零点
0 3 * * 0 /home/opc/clean-logs.sh    # 每周日凌晨 3 点清理日志

*/10 是"每隔 10 分钟",1-5 是"周一到周五",* 是"每一次都执行"。新手最容易写错的是把"日"和"星期"叠加——两者同时填时是"或"的关系,不是"与",尽量只填其中一个。

二、编辑与查看

crontab -e    # 编辑当前用户的定时任务
crontab -l    # 查看已有任务
crontab -r    # 删除全部任务(慎用,没有确认提示)

编辑器默认可能是 vi,不习惯的话可以先设一个:

export EDITOR=nano
crontab -e

三、三个新手必踩的坑

坑一:环境变量不一样。 crontab 里执行的命令环境变量很少,PATH 里常常没有 /usr/local/bin。脚本里写绝对路径最稳妥,或者在脚本开头加一行 source ~/.bashrc。

坑二:相对路径失效。 定时任务的工作目录是用户家目录,脚本里写 ./data 大概率找不到文件。统一用绝对路径,日志也写绝对路径。

坑三:没输出就不知道跑没跑。 每条任务都把输出重定向到日志文件:

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

2>&1 是把错误输出也写进同一个日志。出了问题先看日志,别凭感觉猜。

四、一个真实可用的例子

每天凌晨备份 MySQL 并只保留最近 7 天:

30 2 * * * mysqldump -u root mydb | gzip > /backup/mydb-$(date +\%Y\%m\%d).sql.gz
0 3 * * * find /backup -name "*.sql.gz" -mtime +7 -delete

注意:crontab 里的 % 必须转义成 \%,否则会被当成换行符,这是很多人第一次写备份任务就翻车的原因。

五、怎么确认它真的在跑

grep CRON /var/log/syslog    # Debian/Ubuntu 看系统日志
grep CRON /var/log/cron      # CentOS/RHEL

看到对应时间点的 CRON 记录,说明调度器已经触发了任务。任务本身成没成功,再看你重定向的那个日志文件。

crontab 不难,难的是第一次写的时候不留坑:绝对路径、重定向日志、% 记得转义。这三点做到了,服务器就能替你把重复活干得稳稳当当。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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