强大的crontab
2016-09-25 本文已影响376人
寂寞的原子
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
可能遇到的坑
- crontab配置正确,但没有执行。
注意系统的cron服务有没有启动:# 查看状态 $ sudo systemctl status cron # 激活服务 $ sudo systemctl enable cron
- 系统全局配置
/etc/crontab
不执行。
检查是否写了user,不然就会因为配置文件解析失败导致整个文件被忽略。
因此个人认为使用crontab -e
进行配置更好,如需以root用户配置则使用sudo crontab -e
或sudo crontab -u root -e
。 - 脚本执行失败,找不到命令。
值得注意的是,crontab执行任务时,默认是不带任何环境变量的。可以在配置中显式指定环境变量,或者使用绝对路径来执行命令。