五段式:分 时 日 月 周
$ crontab -e # 编辑当前用户的定时任务(自动用 vim 打开)
$ crontab -l # 列出已有任务
# ┌───── 分钟 (0-59)
# │ ┌───── 小时 (0-23)
# │ │ ┌───── 日 (1-31)
# │ │ │ ┌───── 月 (1-12)
# │ │ │ │ ┌───── 周 (0-7,0 和 7 都是周日)
# * * * * * 命令对照表背这七个就覆盖 95% 的需求:
*/1 * * * * 每分钟 0 2 * * * 每天凌晨 2 点
0 2 * * 1 每周一 2 点 0 2 1 * * 每月 1 号 2 点
30 9 * * 1-5 工作日 9 点半 0 */2 * * * 每 2 小时
0 2 * * * /opt/app/backup.sh >> /var/log/backup.log 2>&1暗坑一:cron 的环境变量被重置
「命令行手跑好好的,放进 cron 就不跑」——九成是环境变量:cron 启动的 shell 是「干净」的,不加载 .bashrc,PATH 只有短短几个目录,你的 java、mvn 一律找不到。
# 解法:脚本里用绝对路径,或在 crontab 顶部补 PATH
PATH=/usr/local/bin:/opt/jdk/bin:/usr/bin:/bin
# 更稳的写法:cron 只负责定时,活交给脚本,变量在脚本里配
0 2 * * * /opt/app/bin/backup.sh暗坑二:输出被静默吞掉
cron 任务的 stdout/stderr 默认发给本地邮件,而大多数服务器没配邮件——报错就这么无声无息地消失了。规则:每条 cron 都显式重定向到日志,跑没跑、报什么,日志说了算。
# 看系统有没有执行过你的任务(时间点对不对一眼便知)
$ tail -f /var/log/cron暗坑三:crontab -r 是一键全删
crontab -r 删除当前用户全部定时任务,且没有任何确认。手滑 -e 敲成 -r 的故事在生产环境屡见不鲜。防呆姿势:把所有 cron 内容托管在文件里(进版本库),机器上只做安装动作:
$ crontab /opt/app/etc/app.cron # 从文件整体导入(覆盖式,可重复执行)
$ crontab -l | wc -l # 导入后核对条数实战:一套完整的日志备份节奏
# crontab 内容
PATH=/usr/local/bin:/usr/bin:/bin
0 1 * * * /opt/app/bin/backup-log.sh >> /var/log/app/backup.log 2>&1
# backup.sh 里做三件事:压缩 → 搬运到数据盘 → 清理 30 天前的备份
# (tar、find -mtime、rm 的组合,全部本系列讲过的命令)下一篇:日志分析——journalctl 与 logrotate 的正确配置,让日志既找得到线索、又不撑爆磁盘。
评论 (0)