美文网首页程序员
笔记整理 - crontab

笔记整理 - crontab

作者: 二石兄 | 来源:发表于2017-12-17 14:53 被阅读82次
Crontab 格式说明

安装

$ 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),穷尽遍历后找不到脚本中使用的命令。

解决方案:

  1. 养成手工安装服务的启动命令统一放在 /usr/local/bin 文件夹下的习惯,并补充到环境变量中
$ vim ~/.bash_profile 或 ~/.zshrc

export PATH=$PATH:/usr/local/bin
  1. 在 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
$ 常规换行的效果

参考

相关文章

网友评论

    本文标题:笔记整理 - crontab

    本文链接:https://www.haomeiwen.com/subject/hogywxtx.html