每个操作系统都有它的自动定时启动程序的功能,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
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编辑当前用户的crontab
crontab -e

# 查看当前用户的crontab
crontab -l

# 删除当前用户的crontab(慎用!)
crontab -r

# 查看crond服务状态
service crond status

# 启动crond服务
service crond start

管理员登录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
2
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
0 2 * * * /opt/scripts/backup.sh

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
2
3
4
5
6
7
@reboot     # 系统启动时执行
@yearly # 每年执行一次(等同于 0 0 1 1 *)
@annually # 同 @yearly
@monthly # 每月执行一次(等同于 0 0 1 * *)
@weekly # 每周执行一次(等同于 0 0 * * 0)
@daily # 每天执行一次(等同于 0 0 * * *)
@hourly # 每小时执行一次(等同于 0 * * * *)

使用 crontab 管理脚本

对于复杂的项目,建议将 cron 任务写到一个独立的脚本中管理,而不是直接在 crontab -e 中编辑:

1
2
3
4
5
6
7
8
# 创建 cron 任务文件
cat > /tmp/mycron << 'EOF'
0 2 * * * /opt/scripts/backup.sh >> /var/log/backup.log 2>&1
0 3 * * 0 /opt/scripts/cleanup.sh >> /var/log/cleanup.log 2>&1
EOF

# 安装到 crontab
crontab /tmp/mycron

这样做的好处是可以使用版本控制系统(如 Git)来管理 cron 配置,方便回滚和团队协作。

写在最后

crontab用法其实很容易掌握。懂得使用crontab,对网站和服务器维护起到很大的帮助,比如定时备份、定时优化服务器、自动清理日志、定期发送监控报告等。

掌握了 crontab,你就掌握了 Linux 系统自动化的第一步。从简单的定时任务开始,逐步构建起自己的自动化运维体系,你会发现运维工作可以变得如此优雅和高效。

转载来源: https://www.centos.bz/2011/03/auto-run-task-crontab/