豁然高

导航

Linux 中的定时处理 cron服务

cron服务

在LINUX中,周期执行的任务一般由cron这个守护进程来处理

当安装完操作系统后默认会安装此服务工具并且会自动启动crond,该进程会每分钟定期检查是否有要执行的任务,若有则执行。

cron服务运行的最小单位是分钟,也就是每分钟cron服务加载一次配置文件,所以我们不能实现每秒钟运行一次cron中的配置项.

cron服务启动或关闭

由于Cron 是Linux的内置服务,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

cron任务文件(配置文件)

cron在3个地方查找配置文件,这些配置文件我们称之为crontab文件,其中包含了命令行及其调用时间

1.  /etc/crontab  (系统任务调度)
这个文件存着系统级的任务。它主要用来运行每日的(daily),每周的(weekly),每月的(monthly)的任务。一般不在此文件安装自己的任务

2.  /etc/cron.d/
此目录下存放的是系统级任务的任务文件。

3.  /var/spool/cron/ (用户任务调度)
此目录下存放各个用户的任务文件。各个用户的任务存放在以自已用户名为文件名的任务文件中。此文件中的指令行没有用户域。

 

cron日志文件

可以通过查看文件/var/log/cron查看任务的运行情况。

 

cron任务文件的编辑

1.可以直接到上面提到的三个位置直接编辑相关的crontab文件

2.也可以通过crontab -e命令进行编辑

通过crontab -e进行编辑,实际上就是编辑/var/spool/cron/目录下的当前用户或者指定用户(-u)的crontab文件(以用户名命名的crontab文件)

3.还可以通过添加file的方式,例如先编写cron脚本,命名为testFile.cron,脚本内容的格式和/etc/crontab文件给出注释格式一样,执行crontab testFile.cron;

crontab命令选项

crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
注:
-u user:用于设定某个用户的crontab,此参数一般由root来运行,不指定的默认情况下是当前登陆的用户
file:是命令文件的名字,表示file作为crontab的任务列表文件并载入crontab,若未指定将接受键盘上键入的命令
-e:进入当前用户的定时任务文件编辑模式
-l:显示当前用户的定时任务文件的命令列表
-r:删除当前用户的crontab文件,也可-u删除指定用户的
-i:在删除用户crontab文件时给确认提示

crontab –e : 修改/var/spool/cron目录下当前用户的 crontab 文件. 如果文件不存在会自动创建,文件名与用户名相同。可以使用-u选项修改指定用户的 crontab文件 
crontab –l : 显示当前用户的 crontab 文件中的任务计划。 可以使用-u选项显示指定用户的 crontab文件 
crontab -r : 删除当前用户的 crontab 文件。可以使用-u选项删除指定用户的 crontab文件 
crontab -ir : 删除 crontab 文件前提醒用户。

 

cron文件语法与写法

每行都包括六个域,其中前五个域是指定命令被执行的时间最后一个域是要被执行的命令

每个域之间使用空格或者制表符分隔

{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} 

 

 minute: 区间为 0 – 59 
 hour: 区间为0 – 23 
 day-of-month: 区间为1 – 31 
 month: 区间为1 – 12. 1 是1月. 12是12月. 
 Day-of-week: 区间为0 – 7. 周日可以是0或7.

 

时间域,除了以上的数字可以填入,还可搭配符号一起:

# 星号(*):代表所有可能的值
# 逗号(,):可以用逗号隔开的值指定一个列表范围,eg:"1,3,5,7,9"
# 中杠(-):可以用整数之间的中杠表示一个整数范围,eg:"1-5",即表示"1,2,3,4,5"
# 正斜线(/):可以用正斜线指定时间的间隔频率,eg:"*/10"表示分钟的话即每十分钟执行一次

 

crontab表达式,前面四项的关系之间为and的关系,需要同时满足才能执行;
但星期那一项与前面月份日期是or的关系,只需满足其一即执行;
 
关于星期和月日的关系,也就是日期(几月几日)和星期的关系,个人总结一下,不一定对
日 月 星期 均为* 时,如 10 10 * * * 相当于每一天都要处理,不需要区分日和星期
日 月 为* ,星期 不为* 时,如 10 10 * * 1 则忽略日月只看星期,即每周一10点10分执行
日 月 不全为* ,星期为* 时,如 10 10 1* * 则忽略星期只看日月,即每月1日10点10分执行
日 月 不全为*,星期 不为* 时,如 10 10 1 * 1 则日月和星期是出于or的关系,即每月1号的10点10分和每周一的10点10分执行
10 10 * 1 1  每年1月的每一天的10点10分和每周一的10点10分执行
 

如果day_of_month和day_of_week同时存在,day_of_month和day_of_week是不能同时起作用的,或者说不是我想象中的and的关系,而是or的关系。

例如:在每个月的1~13号的周1,2,4,5的早上8点执行命令。

想当然的去写:

    * 8 1-13 * 1,2,4,5 data>/opt/tmpFile/testCrontab

是达不到想要的效果,因为day_of_month 和 day_of_week 同时设置的情况下是or的关系,即会出现这样的情况,

每个月的1~13号会执行和所有的周1,2,4,5都会执行这条命令,显然这不是我们想要的结果。
处理方法是,将命令data>/opt/tmpFile/testCrontab单独写到一个脚本里面去,并在这个脚本里面加上对时间的判断

 

实例

每秒执行一次

  最小执行单位为分钟,秒无法实现

每分钟执行一次

  * * * * * 

每小时执行一次

  0 * * * * 

每天执行一次

  0 0 * * * 

每周执行一次

  0 0 * * 0

每月执行一次

  0 0 1 * *

每年执行一次

  0 0 1 1 *

每5分钟执行一次

  */5 * * * *  

每2小时执行一次

  0 */2 * * * 

每3天执行一次

  0 0 */3 * *

每3月执行一次

  0 0 1 */3 *

每小时10分和15分执行一次

  10,15 * * * *

每天1点和3点执行一次

  0 1,3 * * *

每月1号和3号分别执行一次

  0 0 1,3 * *

每年1月和3月分别执行一次

  0 0 1 1,3 *

每年1月至3月分别执行一次

  0 0 1 1-3 *

 

关于cron配置文件/etc/crontab

cron 的主配置文件是 /etc/crontab,它包括下面几行:

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly 

前四行是用来配置 cron 任务运行环境的变量:

Shell 变量的值指定shell 环境(此处默认为 bash shell);

PATH 变量定义用来执行命令的程序路径;

cron 任务的输出被邮寄给 MAILTO 变量定义的用户名,如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出;

HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

如在 /etc/crontab 文件中run-parts部分所示,它使用 run-parts 脚本来执行存在于 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地按照预设时间在每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本,并且具有可执行权限(chmod +x filename)。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。


posted on 2018-12-19 15:46  豁然高  阅读(2630)  评论(0编辑  收藏  举报