定时自动启动任务crontab命令用法
每个操作系统都有它的自动定时启动程序的功能,Windows有它的任务计划,而Linux对应的功能是crontab。
crontab简介
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于”crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρόνος),原意是时间。
通常,crontab储存的指令被守护进程激活,crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。

在实际的服务器运维中,crontab 几乎是最常用的工具之一。无论是定时备份数据库、清理日志文件、发送系统监控报告,还是定期执行数据同步任务,都离不开它的帮助。一个配置合理的 crontab 可以极大地减轻运维人员的工作负担,让系统自动化运转。
crontab的基本格式
crontab的格式如下:
1 | f1 f2 f3 f4 f5 program |
其中各个字段的含义如下:
| 字段 | 含义 | 取值范围 |
|---|---|---|
| f1 | 分钟 | 0-59 |
| f2 | 小时 | 0-23 |
| f3 | 月份中的第几日 | 1-31 |
| f4 | 月份 | 1-12 |
| f5 | 星期中的第几天 | 0-7(0和7都代表周日) |
| program | 要执行的命令或脚本路径 | 任意有效命令 |
理解这个格式是掌握 crontab 的第一步。初学者最容易犯的错误就是搞混字段的顺序,或者对特殊符号的用法不清楚。
特殊符号的含义
掌握特殊符号的用法,可以让你写出更灵活的时间表达式:
- 星号
*:表示”每”。例如 f1 为*表示每分钟都要执行,f2 为*表示每小时都要执行,其余类推。 - 连字符
-:表示范围。例如 f1 为1-5表示第1分钟到第5分钟这段时间内要执行。 - 斜杠
/:表示间隔。例如 f1 为*/5表示每5分钟执行一次。 - 逗号
,:表示列举。例如 f1 为1,15,30表示第1分钟、第15分钟、第30分钟要执行。
crontab常用命令
在开始使用之前,先了解几个最常用的命令:
1 | # 编辑当前用户的crontab |
管理员登录SSH后,输入命令 crontab -e 编辑crontab文件,根据上面的格式输入并保存即可。
实用示例
基础示例
每月每天每小时的第0分钟执行一次 /bin/ls:
1 | 0 * * * * /bin/ls |
在12月内,每天的早上6点到12点中,每隔20分钟执行一次 /usr/bin/backup:
1 | */20 6-12 * 12 * /usr/bin/backup |
周一到周五每天下午5:00寄一封信给 alex@domain.name:
1 | 0 17 * * 1-5 mail -s "hi" alex@domain.name < /tmp/maildata |
每月每天的午夜0点20分、2点20分、4点20分……执行 echo “haha”:
1 | 20 0-23/2 * * * echo "haha" |
晚上11点到早上8点之间每两个小时,以及早上8点执行 date:
1 | 0 23-7/2,8 * * * date |

运维实战示例
在实际工作中,以下是一些非常实用的 crontab 配置:
每天凌晨2点备份MySQL数据库:
1 | 0 2 * * * /usr/bin/mysqldump -u root -p'password' mydb | gzip > /backup/mydb_$(date +\%Y\%m\%d).sql.gz |
注意:在 crontab 中使用 % 时需要用反斜杠转义,否则 % 会被 crontab 解释为换行符。
每30分钟检查一次磁盘空间:
1 | */30 * * * * df -h | awk '$5+0 > 85 {print "Warning: " $5 " used on " $6}' | mail -s "Disk Space Alert" admin@example.com |
每周日凌晨3点清理7天前的日志文件:
1 | 0 3 * * 0 find /var/log -name "*.log" -mtime +7 -delete |
每月1号凌晨1点生成上月报告:
1 | 0 1 1 * * /opt/scripts/monthly_report.sh >> /var/log/monthly_report.log 2>&1 |
常见问题与踩坑经验
在使用 crontab 的过程中,我踩过不少坑,这里总结几个常见的陷阱:
1. 环境变量问题
crontab 执行任务时,不会加载用户的环境变量(如 PATH)。这导致很多在终端里能正常运行的命令,在 crontab 中却找不到。
解决方案:在脚本中使用绝对路径,或者在 crontab 文件开头定义 PATH:
1 | PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin |
2. 输出重定向
如果不重定向输出,cron 会尝试将输出通过邮件发送给当前用户。如果邮件服务没有配置好,可能会造成问题。
建议做法:始终将输出重定向到日志文件:
1 | 0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1 |
3. HP-UX的兼容性问题
在HP-UX中,每20分钟执行一次,表示为:
1 | 0,20,40 * * * * |
而不能采用 */n 方式,否则会出现语法错误。这是不同 Unix 系统之间的差异,需要特别注意。
4. 时间重叠问题
当你设置了多个 cron 任务时,要确保它们不会在同一时间运行,以免争抢系统资源。例如,不要把数据库备份和日志清理都设置在凌晨2点。

进阶技巧
使用特殊字符串
crontab 还支持一些便捷的特殊字符串,可以让配置更简洁:
1 | @reboot # 系统启动时执行 |
使用 crontab 管理脚本
对于复杂的项目,建议将 cron 任务写到一个独立的脚本中管理,而不是直接在 crontab -e 中编辑:
1 | # 创建 cron 任务文件 |
这样做的好处是可以使用版本控制系统(如 Git)来管理 cron 配置,方便回滚和团队协作。
写在最后
crontab用法其实很容易掌握。懂得使用crontab,对网站和服务器维护起到很大的帮助,比如定时备份、定时优化服务器、自动清理日志、定期发送监控报告等。
掌握了 crontab,你就掌握了 Linux 系统自动化的第一步。从简单的定时任务开始,逐步构建起自己的自动化运维体系,你会发现运维工作可以变得如此优雅和高效。








