安装
$ yum install crontabs
$ /sbin/service crond start // 启动服务
$ /sbin/service crond stop // 关闭服务
$ /sbin/service crond restart // 重启服务
$ /sbin/service crond reload // 重新载入配置
$ /sbin/service crond status
开机自动启动:
chkconfig –level 35 crond on
crontab 命令
功能说明:设置计时器。
crontab [-u <用户名称>][配置文件]
crontab [-u <用户名称>][-elr]
cron 是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使 用计时器的功能。
参数:
- -e 编辑该用户的计时器设置。
- -l 列出该用户的计时器设置。
- -r 删除该用户的计时器设置。
- -u<用户名称> 指定要设定计时器的用户名称。
crontab 格式
基本格式 :
* * * * * command
分 时 日 月 周 命令
- 第 1 列表示分钟 1~59 每分钟用 * 或者 */1 表示
- 第 2 列表示小时 1~23(0 表示 0 点)
- 第 3 列表示日期 1~31
- 第 4 列表示月份 1~12
- 第 5 列标识号星期 0~6(0 表示星期天)
- 第 6 列要运行的命令
# Use the hash sign to prefix a comment
# +—————- minute (0 – 59)
# | +————- hour (0 – 23)
# | | +———- day of month (1 – 31)
# | | | +——- month (1 – 12)
# | | | | +—- day of week (0 – 7) (Sunday=0 or 7)
# | | | | |
# * * * * * command to be executed
在以上各个字段中,还可以使用以下特殊字符:
- 星号(*):所有值,例如 month 列是星号时,则表示每月都执行该命令
- 逗号(,):用逗号隔开的值指定一个列表范围,例如 1,2,5,7,8,9
- 中杠(-):用整数之间的中杠表示一个整数范围,例如 2-6 表示 2,3,4,5,6
- 正斜线(/):用正斜线指定时间的间隔频率,例如 0-23/2 表示每两小时执行一次;*/10,minute 列,则表示每十分钟执行一次。
示例
30 21 * * * /etc/init.d/nginx restart
# 每晚的 21:30 重启 nginx
45 4 1,10,22 * * /etc/init.d/nginx restart
# 每月 1、10、22 日的 4 : 45 重启 nginx
10 1 * * 6,0 /etc/init.d/nginx restart
# 每周六、周日的 1:10 重启 nginx。
0,30 18-23 * * * /etc/init.d/nginx restart
# 每天 18:00 至 23:00 之间每隔 30 分钟重启 nginx。
0 23 * * 6 /etc/init.d/nginx restart
# 每星期六的 11 : 00 pm 重启 nginx。
* */1 * * * /etc/init.d/nginx restart
# 每一小时重启 nginx
*/1 * * * * (加可执行脚本)
# 每分钟执行
*:10 * * * * (加可执行脚本)
# 每 10 秒执行
填坑
用户环境变量
手工执行写好的脚本怎么操作都执行成功,但放在 crontab job 中,就报错各种命令找不到。
报错的本质其实就是根据 crontab 根据自己知道的环境变量路径(PATH),穷尽遍历后找不到脚本中使用的命令。
解决方案:
- 养成手工安装服务的启动命令统一放在 /usr/local/bin 文件夹下的习惯,并补充到环境变量中
$ vim ~/.bash_profile 或 ~/.zshrc
export PATH=$PATH:/usr/local/bin
- 在 crontab job 中执行的脚本中,显式的导入已配置好的环境上下文变量
# crontab job script
test -f ~/.bash_profile && source ~/.bash_profile
...
其实就是 crontab 执行脚本的环境上下文与用户登录状态的上下文环境变量是不同的;
把登录时导入的变量/别名/函数在 crontab 任务脚本中引用,那么手工可以执行成功,定时任务也应该成功。
建议脚本执行结果重定向到日志文件,方便调试。
百分号 (%)
man crontab 里有这么一段
Percent-signs (%) in the command,
unless escaped with backslash (), will be changed into newline charac-
ters, and all data after the first % will be sent to the command as
standard input
命令列百分号 (%) 被赋予了特殊含义, 会被看做是换行符,而且其后面的内容被当做命令的标准输入,想正常使用百分号 (%) 的功能,需要使用转义符 ()
# crontab@jyzx.conf
*/1 * * * * cd /opt/scripts/ && bash command-tools.sh monitor >> processes_monitor_$(date '+\%Y\%m\%d').log 2>&1
premature EOF
车祸现场
$ crontab crontab\@jyzx.conf
"crontab@jyzx.conf":3: premature EOF
errors in crontab file, can't install.
conf 配置文档中结尾需要添加一空行;
需要再学习的是在 vim 编辑状态时看不出区别,但 cat 出来就会看到效果。
$ crontab\@jyzx.conf
crontab job script $ 下面要输入命令的锚点没有换行
$ crontab\@jyzx.conf
crontab job script
$ 常规换行的效果