【linux系统下载】linux系统下Crontab 使用入门教程

更新时间:2020-02-12    来源:php入门    手机版     字体:

【www.bbyears.com--php入门】


Crontab 简介

crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρόνος),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。(引用 百度百科 )

Crontab 使用方法

名称 : crontab
使用权限 : 所有使用者
使用方式 :
crontab file [-u user]-用指定的文件替代目前的crontab。
crontab-[-u user]-用标准输入替代目前的crontab.
crontab-1[user]-列出用户目前的crontab.
crontab-e[user]-编辑用户目前的crontab.
crontab-d[user]-删除用户目前的crontab.
crontab-c dir- 指定crontab的目录。
crontab文件的格式:M H D m d cmd.
M: 分钟(0-59)。
H:小时(0-23)。
D:天(1-31)。
m: 月(1-12)。
d: 一星期内的天(0~6,0为星期天)。
cmd要运行的程序,程序被送入sh执行,这个shell只有USER,HOME,SHELL这三个环境变量
说明 :
crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表。-u user 是指设定指定
user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设
定自己的时程表。
参数 :
crontab -e : 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,如果你想用别的文字编辑器,则请先设定 VISUAL 环境变数
来指定使用那个文字编辑器(比如说 setenv VISUAL joe)
crontab -r : 删除目前的时程表
crontab -l : 列出目前的时程表
crontab file [-u user]-用指定的文件替代目前的crontab。
时程表的格式如下 :
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执
行的程序。
当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推
当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推
当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推
当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推
使用者也可以将所有的设定先存放在档案 file 中,用 crontab file 的方式来设定时程表。


man crontab 一下会发现有以下2种用法:

crontab [-u user] file
crontab [-u user] { -l | -r | -e }

# 其中 -u user 为可选项,当无 -u 项时为当前用户
第1行用法,如果 file 文件存在,则将文件复制到 crontabs 目录;如 file 不存在则接受标准输入方式。

第2行用法有3个选项:

-l 列出当前 crontab 配置(Display the current crontab on standard output)
-r 删除当前 crontab 配置(Remove the current crontab)
-e 编辑当前 crontab 配置(Edit the current crontab using the editor)
Crontab 使用语法


Crontab 语法很简单,为 “周期 命令” 的形式,具体如下:

*  *  *  *  *  command to be executed
┬  ┬  ┬  ┬  ┬
│  │  │  │  │
│  │  │  │  │
│  │  │  │  └───── day of week (0 - 6) (0 is Sunday, or use names)
│  │  │  └────────── month (1 - 12)
│  │  └─────────────── day of month (1 - 31)
│  └──────────────────── hour (0 - 23)
└───────────────────────── min (0 - 59)
上面例子中 “*” 依次代表的是分、时、日、月、礼拜几,看一下周期时间的具体格式:


Field name  Mandatory?  Allowed values  Allowed special characters
Minutes       Yes         0-59               * / , -
Hours         Yes         0-23               * / , -
Day of month  Yes         1-31               * / , - ? L W
Month         Yes         1-12 or JAN-DEC    * / , -
Day of week   Yes         0-6 or SUN-SAT     * / , - ? L #
Year          No          1970?2099          * / , -

特殊符号说明:

* cron表达式匹配的字段的所有值, 例如第4列用*表示每月
/ 描述范围的增量, 如第1列使用 */15 表示每15分钟执行一次
, 表示是一个List,如第1列使用 10,20,30 表示在每小时的第10、20、30分钟执行
- 定义范围,如第4列使用 1-5 表示在每年的1~5月执行
? 只在日期和星期字段出现,表示无意义的值,相当于定位符
L 只在日期和星期字段出现,如在日期字段表示当月最后一天,在星期字段则表示星期6(如果星期字段为4L则为最后当月最后一个星期5).
W 只在日期字段出现,如 1W 表示离1号最近的工作日
# 只在星期字段出现,如 4#3 表示当月第3个星期5

一些例子:


每年1月1日0点0分 0 0 1 1 *
每月1日0点0分    0 0 1 * *
每周日0点0分     0 0 * * 0
每天0点0分       0 0 * * *
每小时0分        0 * * * *
Tips

command 标准输出发送 email


30 7 * * * python test.py | mail -e -s "subject" xxxx@liluo.org
# 需配置好 send_mail

命令之后重定向


command > file 把标准输出重定向到文件
command >> file 把标准输出追加到文件

command 1 > file 把标准输出重定向到文件
command 2 > file 把标准错误重定向到文件
command 2 >> file 把标准输出追加到文件
command 2>&1 把command命令标准错误重定向到标准输出
command > file 2>&1 把标准输出和标准错误一起重定向到文件
command >> file 2>&1 把标准输出和标准错误一起追加到文件

command < file 把command命令以file文件作为标准输入
command < file >file2 把command命令以file文件作为标准输入,以file2文件作为标准输出
command <&- 关闭标准输入

例子


crontab文件的一些例子:
30 21 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每晚的21:30重启apache。
45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每月1、10、22日的4 : 45重启apache。
10 1 * * 6,0 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每周六、周日的1 : 10重启apache。
0,30 18-23 * * * /usr/local/etc/rc.d/lighttpd restart
上面的例子表示在每天18 : 00至23 : 00之间每隔30分钟重启apache。
0 23 * * 6 /usr/local/etc/rc.d/lighttpd restart
上面的例子表示每星期六的11 : 00 pm重启apache。
* */1 * * * /usr/local/etc/rc.d/lighttpd restart
每一小时重启apache
* 23-7/1 * * * /usr/local/etc/rc.d/lighttpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 11 4 * mon-wed /usr/local/etc/rc.d/lighttpd restart
每月的4号与每周一到周三的11点重启apache
0 4 1 jan * /usr/local/etc/rc.d/lighttpd restart
一月一号的4点重启apache


用Crontab+Shell实现实时监控系统

在系统网站的运营过程中,我们需要知道网站或者系统是否24小时在正常运行,一般系统正常运作需要两个东西在支持,一个是web服务器,一个是数据库
那么我们就需要实时的监控web服务器和数据库是否在运行。下面我们以apache服务器和mysql数据库作为例子来分析如何实现需求。
1.监控mysql数据库是否正常运行
正常情况我们登录一台Linux服务器后,想要查看当前服务器Mysql是否在运行,我们会执行 pgrep mysql查看,如果有打印出进程ID说明mysql是正常在运行的。
根据这个原理可以写出如下SHELL脚本:

#!/bin/bash
check=`pgrep mysql`
if [ -n "$check" ]; then
    exit
else
  date=$(date +"%Y-%m-%d %H:%M:%S")
  /etc/init.d/mysqld restart
  echo 'mysqld exception at' $date 'and restart '
fi

判断是否存在进程 mysql,存在则正常不存在则说明mysql可能挂了,可以执行重启操作,当然你也可以直接发送邮件到指定邮箱。

2.监控apache是否正常运行根据监控mysql的经验,我们可以这样写SHELL脚本:

#!/bin/bash
check=`pgrep httpd`
if [ -n "$check" ]; then
  exit
else
  date=$(date +"%Y-%m-%d %H:%M:%S")
  /etc/init.d/httpd restart
  echo 'apache exception at' $date 'and restart '
fi

还有种可能是apache可能不在同一台服务器上,则可以用下面的SHELL脚本实现:

if curl -m 10 -G localhost:81 > /dev/null 2>&1
then
      echo 'server is running'
else
      if ping -c 1 localhost > /dev/null 2>&1
      then
        echo 'server exception but ip ping success'
      fi
fi

原理类似于直接访问URL判断是否有响应,分别判断apache端口和服务器IP。如果系统访问无响应有可能是apache服务挂了,还有一种可能是服务器挂了,所以用PING 的方式来判断服务器是否正常。

最后一步,就是把以上两个脚本添加到定时任务中去执行:

crontab -e

* * * * * sh /alidata/test/mysqlListener.sh >> /var/log/mysqlL.log

* * * * * sh /alidata/test/httpdListener.sh >> /var/log/httpdL.log

这样就每分钟都会去判断apache和mysql是否正常运行,基本达到实时监控,如果加上邮件通知的话,只要系统出现故障,达到实时邮件通知。

本文来源:http://www.bbyears.com/jiaocheng/85187.html

热门标签

更多>>

本类排行