×

强大的crontab

96
寂寞的原子
2016.09.25 23:41* 字数 617

Unix-like 系统中都有一个定时任务服务:crontab
最近用它来处理开机自动启动服务,以及定期刷新证书,十分方便。

配置文件

# 用户级配置文件
$ crontab [-u user] {-e | -l | -r}
# `-e`编辑,`-l`显示,`-r`删除

# 系统全局配置文件
$ vim /etc/crontab
  • 使用crontab -e修改用户级配置文件,退出编辑时将自动重新加载,立即生效,并保存到/var/spool/cron/crontabs/$username(可能会根据系统有所变化)。
  • 系统级/etc/crontab通常会被cron服务每分钟读取一次,因此也相当于是实时生效的,无需重启系统。

配置格式

配置文件中可定义环境变量:

PATH=/usr/bin:/usr/local/bin

配置文件每行定义一个任务,格式如下,每列之间用至少一个空白符隔开:

# 用户级
时间 绝对路径 [参数...]

# 全局`/etc/crontab`多一列`user`
时间 用户 绝对路径 [参数...]

时间的格式通常为5列,分别表示

  • 分钟:0-59
  • 小时:0-23
  • 日期:0-31
  • 月份:0-12或者名字
  • 星期:0-7或者名字

每个字段均可以有一下表示方法:

  • 时间范围用-连接,如1-3
  • 多个时间点或范围用,隔开,如1,3-5
  • *,表示first-last,即每个最小单位都执行任务。
  • 时间间隔写在时间范围后面,用/隔开,如:*/2, 1-3/2

此外还有一些特殊的运行时机表示方法,用@开头:

  • @reboot,每次系统启动的时候运行。
    rc.local相比,这种方式开机启动脚本,可以更好地跨平台、跨系统,而且是异步加载,不会阻塞系统启动。

实例如下:

# 每5分钟执行
*/5 * * * * /home/gerald/run_every_5_min
# 每个月1号2点执行
0 2 1 * * /home/gerald/run_per_month
# 每个月1号和15号的2点执行
0 2 1,15 * * /home/gerald/run_twice_per_month
# 每次开机执行
@reboot /home/gerald/run_on_reboot

可能遇到的坑

  1. crontab配置正确,但没有执行。
    注意系统的cron服务有没有启动:
    # 查看状态
    $ sudo systemctl status cron
    # 激活服务
    $ sudo systemctl enable cron
    
  2. 系统全局配置/etc/crontab不执行。
    检查是否写了user,不然就会因为配置文件解析失败导致整个文件被忽略。
    因此个人认为使用crontab -e进行配置更好,如需以root用户配置则使用sudo crontab -esudo crontab -u root -e
  3. 脚本执行失败,找不到命令。
    值得注意的是,crontab执行任务时,默认是不带任何环境变量的。可以在配置中显式指定环境变量,或者使用绝对路径来执行命令。
利器
Web note ad 1