`

linux 定时任务

 
阅读更多

 

在linux中,周期执行的任务一般由crond这个守护进程来处理。crond读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。cron的配置文件称为crontab(cron table)

一、crond服务

systemctl start crond           //启动服务

systemctl stop crond           //关闭服务

systemctl restart crond        //重启服务

systemctl reload crond       //重新载入配置

systemctl status crond        //查看服务状态

二、cron在3个地方查找配置文件

1. /var/spool/cron/ 目录下存放包括root在内所有用户的定时任务,每个用户的所有定时任务保存在该目录下的与用户同名的文件

Linux Filesystem Structure
5.11 /var/spool : Spool directories
/var/spool is traditionally used for machine-local data being spooled to or from UNIX subsystems. For example, print jobs are spooled here for delivery to the lineprinter daemon, out-bound mail is spooled for delivery to remote systems, and UUCP files are spooled for transmission to UUCP neighbors. In-bound mail and news are spooled here for delivery to users, and at and cron jobs are spooled for delayed execution by the cron daemon.

2. /etc/crontab 文件负责调度各种管理和维护任务

3. /etc/cron.d/ 目录用来存放任何要执行的crontab文件或脚本

三、crontab命令

crontab [-u username]    //省略用户表表示操作当前用户的crontab
    -e      (编辑工作表)
    -l      (列出工作表里的命令)
    -r      (删除工作表)

 crontab命令操作的实际就是 /var/spool/cron 目录下的文件。crontab -e 进入当前用户的工作表编辑,是常见的 vim界面,每行都是一项任务。任务格式:

minute hour day month dayOfWeek     command
minute:     分钟,0-59整数
hour:       小时,0-23整数
dyay:       日期,0-31整数(如指定月份,则必须是该月有效日期)
month:      月份1-12整数,(或使用英文简写jan、feb)
dayOfWeek:  周几,0-7整数,0或7都代表星期天(或使用英文简写如sun、mon)
command:    执行的命令(可以是系统命令,也可以是脚本文件)

上面定义定时任务执行周期的几项中
星号*    表示所有有效值
短线-    执行一个整数范围
逗号,    指定多个多个固定值
正斜线/  用来指定频率,斜线前表示范围,后面表示频率。如在分钟位置0-29/2 表示在0到29分钟期间每隔2分钟执行一次,也经常配合*使用:*/1

crontab文件注释符号为 #  

四、/etc/crontab文件和/etc/cron.d目录

[root@instance-gc45taul bin]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# 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

 从上面可以看到 /etc/crontab文件中任务比用户定时任务(/var/spool/cron目录下任务)多了一个 user-name字段。因为是全局性的计划任务需要指定执行人。当我们要增加全局性的计划任务一般不直接修改/etc/crontab,而是在/etc/cron.d目录下新增任务文件。比如 /etc/con.d/0hourly内容如下

[root@instance-w6b0iilx cron.d]# cat 0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly  //run-parts的作用是执行一个目录下的所有脚本程序

五、cron使用权限

/etc/cron.allow和/etc/cron.deny 控制文件用来限制用户对cron的使用。格式都是每行一个用户,且不允许空格。控制文件被修改无需重启crond服务,因为用户每次添加或删除一项cron任务都会重新读取一遍控制文件。另外,无论控制文件如何设置,root用户都能使用cron

 控制文件生效规则:

1.如果两个文件都不存在,则只用root能使用crontab命令

2.只要有cron.allow存在,则只有cron.allow文件中的用户能使用crontab

3.如果没有cron.allow,只用cron.deny,则除了cron.deny文件以外的用户都能使用crontab

六.anacron

一般linux服务器都是24小时运行的,一般的计划任务是用crontab来实现。但是如果出现因某些原因服务器关机的情况,那么在关闭期间应当执行的计划任务当次就不会执行,这种情况在某些业务场景下是不可接受的。这时候就需要使用anacron来指定计划任务,它会在系统重新开机后,把关机时间内的计划任务执行一次。

anacron命令

anacron [options] [job]
-s:  开始所有jobs,并根据时间戳判断是否开始相应的job
-f:  强制执行,忽略时间戳对比
-n:  立即进行未进行的任务,忽略延迟等待时间
-u:  仅升级相应的时间戳,实际不进行任何工作
job: /etc/anacrontab 文件中定义的各项工作名称

 /etc/anacrontab

此文件为anacron任务的配置文件

[root@instance-w6b0iilx ~]# cat /etc/anacrontab 
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days   delay in minutes   job-identifier   command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly

 RANDOM_DELAY=45: 设置为anacron任务添加的随机延迟的最大值,单位为分钟,一个anacron任务运行的总延迟时间为 RANDOM_DELAY+BASE_DELAY;

START_HOURS_RANGE=3-22:设置anacron任务执行的时间范围,表示任务只能在这个时间范围内执行

 

anacron任务配置行,每一行对应一个anacron任务,其中:

period in days: 指任务在多少天内执行一次,7表示7天内执行一次,也可以使用@daily、@weekly、@monthly来表示周期

delay in minutes:延迟时间(即上面的BASE_DELAY),单位为分钟

job-identifier:任务标识,这个与/var/spool/anacron/ 目录下的时间戳文件名相一致,anacron通过此标识来获取对应的时间戳判断是否该执行此任务

command:anacron任务执行的内容

 

anacron任务工作流程

以centos6.8为系统背景对相关anacron流程进行描述

/etc/cron.d 目录下有一个0hourly文件,由crond执行这个定时任务,每小时执行一次 /etc/cron.hourly下的所有脚本

[root@instance-w6b0iilx cron.d]# cat 0hourly 
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly //run-parts就是/usr/bin目录下的一个shell脚本用于执行某个目录下的所有

/etc/cron.hourly 目录下只有一个0anacron脚本文件

[root@instance-w6b0iilx cron.hourly]# cat 0anacron 
#!/bin/sh
# Check whether 0anacron was run today already
if test -r /var/spool/anacron/cron.daily; then //判断时间戳文件是否存在
    day=`cat /var/spool/anacron/cron.daily`   //赋值给变量day
fi
if [ `date +%Y%m%d` = "$day" ]; then  //day如果是当前日期,则退出脚本,
    exit 0;
fi

# Do not run jobs when on battery power  //电池模式下不执行anacron任务
if test -x /usr/bin/on_ac_power; then
    /usr/bin/on_ac_power >/dev/null 2>&1
    if test $? -eq 1; then
    exit 0
    fi
fi
/usr/sbin/anacron -s    //执行anacron任务

 /usr/sbin/anacron 会执行/etc/anacrontab 里面的所有anacron任务,/etc/anacrontab默认内容在上文中

 

以anacrontab文件中的cron.daily这个job为例。根据上述描述,anacron的工作流程可以总结为:

1.系统启动后,crond服务执行每小时调度任务/etc/cron.d/0hourly来执行/etc/cron.hourly/0anacron任务

2./etc/cron.hourly/0anacron先判断今天是否执行过anacron任务,随后判断系统是否运行在电池模式,都为否,则执行/usr/sbin/anacron -s命令

3.anacron命令查找 /etc/anacrontab文件,得到cron.daily任务工作间隔为1天

4.anacron命令从/var/spool/anacron/cron.daily文件(此文件两个作用,第一0anacron脚本中判断是否要执行脚本,第二作为cron.daily任务的时间戳文件)中取出此任务最近一次运行时间

5.对比当前时间与文件中读取时间,若差异天数在1天或以上,则准备运行任务

6.在延迟时间后,开始运行相关命令,即执行 /etc/cron.daily目录下所有脚本

7.运行完毕,修改对应时间戳文件为当前文件,结束

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics