程序员

笔记整理 - crontab

2017-12-17  本文已影响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 是一个常驻服务,它提供计时器的功能,让用户在特定的时间得以执行预设的指令或程序。只要用户会编辑计时器的配置文件,就可以使 用计时器的功能。

参数:

crontab 格式

基本格式 :

* *  *  *  *  command
分 时 日 月 周  命令
# 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

在以上各个字段中,还可以使用以下特殊字符:

示例

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
$ 常规换行的效果

参考

上一篇 下一篇

猜你喜欢

热点阅读