crontab
是 Linux
和类 Unix
系统中用来管理定时任务的命令。通过 crontab
,可以定期执行脚本或命令,比如每天备份、自动清理日志等。crontab
是基于 cron 服务的用户接口,每个用户都可以单独定义自己的定时任务。
基本语法
1 | crontab [选项] |
- 常用选项:
选项 | 功能 |
---|---|
-e |
编辑当前用户的 crontab 文件。 |
-l |
列出当前用户的 crontab 内容。 |
-r |
删除当前用户的 crontab 文件(清空定时任务)。 |
-u 用户 |
指定用户管理其 crontab (需要管理员权限)。 |
crontab
文件格式
crontab
文件的每一行定义一个任务,其格式如下:
1 | 分钟 小时 日 月 星期 [命令或脚本] |
- 时间字段的解释:
字段 | 范围 | 描述 |
---|---|---|
分钟 | 0-59 |
指定在每小时的哪一分钟执行任务。 |
小时 | 0-23 |
指定在每天的哪个小时执行任务。 |
日 | 1-31 |
指定在每月的哪一天执行任务。 |
月 | 1-12 |
指定在哪个月执行任务。 |
星期 | 0-7 |
指定在每周的哪一天执行任务,0 和 7 都表示星期日。 |
- 特殊符号:
符号 | 含义 |
---|---|
* |
任意值(例如,每分钟、每天等)。 |
, |
指定多个值(例如,1,15 表示第 1 分钟和第 15 分钟)。 |
- |
指定范围(例如,1-5 表示从第 1 分钟到第 5 分钟)。 |
/ |
指定步长(例如,*/5 表示每 5 分钟执行一次)。 |
示例任务时间表
表达式 | 含义 |
---|---|
0 5 * * * |
每天早上 5 点执行任务。 |
30 8 * * 1-5 |
每周一到周五早上 8:30 执行任务。 |
*/10 * * * * |
每 10 分钟执行一次任务。 |
0 0 1 * * |
每月 1 日凌晨 0 点执行任务。 |
0 0 * * 0 |
每周日凌晨 0 点执行任务。 |
0 */2 * * * |
每两小时执行一次任务。 |
0 8,18 * * * |
每天 8 点和 18 点执行任务。 |
crontab
管理任务的步骤
查看当前用户的任务
- 命令:
1
crontab -l
- 说明:
- 列出当前用户的所有定时任务。
- 如果没有任务,则会显示类似以下内容:
1
no crontab for <user>
编辑定时任务
- 命令:
1
crontab -e
- 说明:
- 打开当前用户的
crontab
文件(默认使用系统的文本编辑器,如vim
或nano
)。 - 在文件中添加新的任务,每行一个任务。
- 打开当前用户的
示例:
在 crontab -e
中添加以下内容:
1 | 0 6 * * * /home/user/backup.sh |
- 任务说明:
- 每天早上 6 点运行
/home/user/backup.sh
脚本。
- 每天早上 6 点运行
删除所有定时任务
- 命令:
1
crontab -r
- 说明:
- 删除当前用户的所有定时任务。
- 注意:此操作不可恢复,请小心使用!
为其他用户管理任务
- 命令(需要管理员权限):
1
sudo crontab -u username -e
- 说明:
- 编辑指定用户的
crontab
文件。 - 通常用于管理员为其他用户配置任务。
- 编辑指定用户的
特殊时间宏
crontab
支持一些特殊的时间宏,可以简化时间表达式:
宏 | 等价表达式 | 含义 |
---|---|---|
@reboot |
- | 系统启动时执行任务。 |
@yearly 或 @annually |
0 0 1 1 * |
每年执行一次(1 月 1 日 0 点)。 |
@monthly |
0 0 1 * * |
每月执行一次(1 日 0 点)。 |
@weekly |
0 0 * * 0 |
每周执行一次(周日 0 点)。 |
@daily 或 @midnight |
0 0 * * * |
每天执行一次(0 点)。 |
@hourly |
0 * * * * |
每小时执行一次。 |
示例:
- 在系统启动时运行任务:
1
@reboot /home/user/startup.sh
查看和调试任务
查看任务执行日志
- 系统会记录
cron
任务的执行日志,日志文件通常位于:-
Debian/Ubuntu:
1
/var/log/syslog
查看日志:
1
grep CRON /var/log/syslog
-
CentOS/RHEL:
1
/var/log/cron
-
调试任务
如果任务没有按预期执行,可以尝试以下方法:
-
确保脚本有可执行权限:
1
chmod +x /path/to/script.sh
-
使用绝对路径:
- 在
crontab
中,环境变量可能与登录时不同,因此需要使用命令或文件的绝对路径。
- 在
-
捕获输出:
- 将标准输出和错误输出重定向到日志文件:
1
0 6 * * * /home/user/backup.sh >> /home/user/backup.log 2>&1
- 将标准输出和错误输出重定向到日志文件:
-
测试环境变量:
- 在脚本顶部添加:
1
env > /tmp/env.log
- 查看是否缺少必要的环境变量。
- 在脚本顶部添加:
综合示例
示例 1:每周一凌晨 2 点备份日志文件
1 | 0 2 * * 1 tar -czf /var/backups/logs_$(date +\%Y\%m\%d).tar.gz /var/log |
示例 2:每 10 分钟检查服务是否运行
1 | */10 * * * * systemctl is-active nginx || systemctl start nginx |
- 如果 Nginx 服务未运行,则启动它。
示例 3:系统启动时挂载网络驱动器
1 | @reboot mount -t nfs 192.168.1.100:/shared /mnt/network |
示例 4:每天下午 5 点发送提醒邮件
1 | 0 17 * * * echo "Backup completed" | mail -s "Daily Backup Status" user@example.com |
注意事项
-
环境变量:
cron
的运行环境与用户登录的环境不同,可能缺少一些变量。- 可以在任务开头指定所需变量,例如:
1
PATH=/usr/local/bin:/usr/bin:/bin
-
权限问题:
- 普通用户只能编辑自己的
crontab
。 /etc/cron.allow
和/etc/cron.deny
文件可以控制用户是否允许使用cron
。
- 普通用户只能编辑自己的
-
任务频率太高:
- 如果任务频率太高(如每秒运行一次),可能会对系统造成压力。
总结
crontab
是 Linux 系统中管理定时任务的核心工具,具有灵活强大的时间调度功能。- 常用命令:
- 查看任务:
crontab -l
- 编辑任务:
crontab -e
- 删除任务:
crontab -r
- 查看任务:
- 编写任务时要特别注意时间字段格式、环境变量和日志捕获等问题,以确保任务正常执行。