什么是 Crontab?
Crontab 是 Unix/Linux 系统下功能强大的定时任务调度工具。它允许用户在无需人工干预的情况下,按照预设的时间计划自动执行指定的命令或脚本。
Crontab 的安装与启动
在 CentOS / RHEL / Fedora 系统上
通常,cronie 软件包提供了 crontab 服务。使用以下命令进行安装和配置:
# 安装 crontab 服务
sudo yum install cronie
# 设置开机自启
sudo systemctl enable crond
# 启动服务
sudo systemctl start crond
# 检查服务状态
sudo systemctl status crond
说明:在较新的 CentOS/RHEL 7+ 和 Fedora 系统中,服务管理命令已从 service 和 chkconfig 过渡到 systemctl。
在 Debian / Ubuntu 系统上
在大多数 Debian 和 Ubuntu 发行版中,cron 服务通常已预装。如需安装或管理,请使用:
# 安装 cron 服务(通常已安装)
sudo apt-get install cron
# 启动/重启服务
sudo systemctl restart cron
# 设置开机自启
sudo systemctl enable cron
Crontab 的基本使用方法
1. 查看当前用户的定时任务列表
crontab -l
2. 编辑当前用户的定时任务
crontab -e
执行此命令后,系统会使用默认的文本编辑器(通常是 vim 或 nano)打开当前用户的 crontab 配置文件。
- 使用 nano 编辑器:编辑完成后,按
Ctrl+X,然后输入Y确认保存,最后按Enter退出。 - 使用 vim 编辑器:按
i进入插入模式进行编辑,完成后按ESC退出插入模式,输入:wq保存并退出。
3. 删除当前用户的所有定时任务
crontab -r
注意:此操作会直接删除所有任务,请谨慎使用。
Crontab 时间格式详解
一条完整的 crontab 命令由两部分组成:时间计划和要执行的命令,其基本格式如下:
* * * * * command-to-be-executed
│ │ │ │ │
│ │ │ │ └─── 星期几 (0 - 7) (0 和 7 都代表星期日)
│ │ │ └───── 月份 (1 - 12)
│ │ └─────── 日期 (1 - 31)
│ └───────── 小时 (0 - 23)
└─────────── 分钟 (0 - 59)
时间字段中可以使用以下特殊字符:
| 符号 | 含义 | 示例 |
|---|---|---|
* (星号) |
代表该字段的所有有效值。 | 0 * * * * 表示每小时的第0分钟执行。 |
, (逗号) |
指定一个列表值。 | 0 8,12,18 * * * 表示在8点、12点、18点整执行。 |
- (连字符) |
指定一个范围值。 | 0 9-17 * * * 表示从9点到17点,每小时整点执行。 |
/ (斜杠) |
指定间隔频率。 | */15 * * * * 表示每15分钟执行一次。 |
常用 Crontab 任务示例
# 每天凌晨3点执行备份脚本
0 3 * * * /root/scripts/backup.sh
# 每周日晚上8点30分清理日志
30 20 * * 7 /root/scripts/clean_logs.sh
# 每周一和周五的午夜执行测试
0 0 * * 1,5 /usr/local/bin/test
# 每年5月12日下午2点执行特定任务
0 14 12 5 * /root/scripts/memorial.sh
# 每天傍晚6点到晚上11点,每15分钟重启一次服务
*/15 18-23 * * * systemctl restart php-fpm
# 系统级常用计划示例
*/5 * * * * # 每5分钟
0 * * * * # 每小时
0 0 * * * # 每天午夜
0 0 * * 0 # 每周日午夜
0 0 1 * * # 每月1号午夜
0 0 1 1 * # 每年1月1号午夜
高级技巧与注意事项
1. 环境变量问题
Cron 任务执行的环境与用户登录环境不同,可能缺少必要的 PATH 等环境变量。建议在脚本中使用绝对路径,或在 crontab 文件顶部定义环境变量:
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# 然后是你的任务
0 * * * * /full/path/to/your/script.sh
2. 输出重定向
默认情况下,cron 任务的输出会以邮件形式发送给用户。为避免邮箱被塞满,通常将输出重定向:
# 将标准输出和错误输出都重定向到日志文件
0 3 * * * /root/backup.sh > /var/log/backup.log 2>&1
# 或者丢弃所有输出
0 3 * * * /root/backup.sh > /dev/null 2>&1
3. 系统级 Crontab
除了用户级的 crontab -e,系统管理员还可以直接编辑 /etc/crontab 文件或 /etc/cron.d/ 目录下的文件来安排系统级任务。系统级 crontab 文件需要额外指定执行命令的用户:
# /etc/crontab 格式示例
# m h dom mon dow user command
0 5 * * * root /root/scripts/system_backup.sh
通过掌握以上知识,您应该能够熟练地使用 Crontab 来自动化您的系统管理任务、数据备份、日志清理等日常操作。