参考:

1 简介

我们可以利用crontab命令实现linux环境下的定时任务执行。

2 使用

crontab支持的命令如下:

参数功能
-e编辑定时任务
-l查看定时任务
-r删除定时任务
-u username可选,指定用户,默认为当前用户

2.1 设置定时任务

用户使用crontab -e命令可以设置定时任务,按照vim的使用习惯编辑和保存。每一行是一个任务,任务格式如下:

分钟 小时 日 月 星期 命令

如果特定的位置为:

  • 数字,如 1,那么则在该时间点触发
  • 范围,如 1-2,那么则在该时间范围触发
  • 离散数组,如 1,2,3,那么则在特定时间点触发
  • 星号,如*,那么在所有时间点触发
  • 除号,如/,那么以特定时间间隔触发

保存后不会及时生效,建议提前设置或重启crontab服务立即生效。

service cron restart

2.1.1 示例

每分钟执行一次命令

- * * * * command

每周三的上午 5 点 10 分到 5 点 30 分,每间隔 3 分钟执行一次命令

10-30/3 5 * * 3 command

每年 2、6 月的 1 日 0 点触发一次命令

0 0 1 2,6 * command

2.2 查看定时任务

用户使用crontab -l查看当前用户下的定时任务。

2.3 查看日志

crontab有命令执行失败时,用户在登录控制台一般会收到mail提示,此时可以通过查看/var/spool/mail/root文件来看crontab的执行日志了。

3 相关文件

  • /var/spool/cron/目录下存放的是每个用户包括 root 的 crontab 任务,每个任务以创建者的名字命名
  • /etc/crontab这个文件负责调度各种管理和维护任务。
  • /etc/cron.d/这个目录用来存放任何要执行的 crontab 文件或脚本。

4 常见问题

4.1 crontab 执行时间不准确

crontab命令仅能保证分钟级的精度,就比如我们指定 9:10 分执行,那么它可能在 9:10:30 秒执行。

4.2 环境变量问题导致命令执行失败

当命令手动执行时正常但在crontab中执行失败时就需要注意,可能是环境变量没有导入。其原因是crontab执行时默认不会加载$HOME/.bash_profile中的环境变量,甚至一些常见的系统变量也没有正确加载。

所以要么在命令中先添加环境变量,如:

* * * * * source /home/user/.bash_profile && command

要么在 crontab 中直接指定环境变量,如:

# env
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
HOME=/home/user
 
# crontab
* * * * * command