1.什么是定时任务
通过定时让系统在规定的时间去执行任务。
2.定时任务的种类:at和cron
定时任务有两种工作方式:一是例行性的,就是每隔一定的周期就要执行一次的任务,使用at来实现;二是突发性的,就是执行完一次就不再执行的任务,使用crontab实现。
at:用于处理仅执行一次任务的指令。要执行at,需要atd服务的支持。
atd服务下载路径:
http://rpmfind.net/linux/centos/7.7.1908/os/x86_64/Packages/at-3.1.13-24.el7.x86_64.rpm
crontab:用于周期性执行任务的指令。周期的时间可以是分钟,小时,周,月,年等。crontab除了可以使用指令执行外,还可以通过编辑/etc/crontab来实现。要使得crontab可以生效,需要crond服务的支持。
3.at单次执行任务的运作方式
使用at来执行任务时,一种方式是将任务以文本文件的方式写入/var/spool/at/目录下,就可以等待atd服务的调用和执行了;第二种是使用at命令,进入到at shell环境执行所需的命令。
对于at,可以使用/etc/at.allow和/etc/at.deny这两个文件来进行at的使用限制。有了这两个文件的情况下,at的工作情况如下:
- 先寻找/etc/at.allow文件,写在这个文件中的使用者才能使用at,否则不能(即使在at.deny文件中没有写)。
- 如果/etc/at.allow不存在,就寻找/etc/at.deny文件,写在这个文件中的使用者不能使用at,没有被卸载文件中的使用者可以使用at。
- 如果两个文件都不存在,则只有root可以使用at。
4.at的使用方式
#at [-mldv] TIME
#at -c 工作号
选项与参数:
- -m:当at的工作完成后,即使没有输出信息,也通过email通知使用者。
- -l:at -l相当于atq,列出当前系统上的所有用户的at任务。
- -d:at -d相当于atrm,可以取消一个在at中的任务。
- -v:可以使用较明显的时间格式列出at任务的任务表。
- -c:可以列出后边接的该项任务的实际指令内容。
- TIME:时间格式,可以定义出【什么时候要进行at任务】的时间,格式有:
- HH:MM ex> 04:00 在今天的HH:MM时刻进行,若时间已超过,则明天的HH:MM时刻进行。
- HH:MM YYYY-MM-DD ex> 04:00 2020-03-31 强制在某年某月某日的规定时刻进行。
- HH:MM[am|pm] [Month] [Date] ex> 04pm July 30 强制在某月某日的规定时刻进行,am和pm分别代表上午和下午。
- HH:MM[am|pm] + number [minutes|hours|days|weeks] ex> now + 5 minutes 或 ex> 04pm + 3 days 在当前或某个时间点,再加一段时间。
示例:让系统在10分钟后关机
#at now + 10 minutes (注意单位要加s,使用at时会进入下边的at shell的环境来让用户下达命令,建议命令中路径使用绝对路径。)
at> /bin/sync
at> /bin/sync
at> /sbin/shutdown -h now
at> <EOT> (此处输入[ctrl]+d就会出现<EOT>的字样,表示结束。)
job 1 at Tue Mar 31 15:54:00 2020 (此处会显示刚刚输入的指令编号和执行时间)
5.指令的删除
atq:查询当前主机上有多少的at任务。
atrm+任务号:指定移除任务。
6.crontab周期性执行任务的运作方式
周期执行任务是由cron(crond)服务来控制的。
对于周期性执行任务,使用的则是crontab命令。
对于crontab,同样可以使用/etc/cron.allow和/etc/cron.deny这两个文件来进行crontab的使用限制。有了这两个文件的情况下,crontab的工作情况如下:
先寻找/etc/cron.allow文件,写在这个文件中的使用者才能使用crontab,否则不能(即使在cron.deny文件中没有写)。
如果/etc/cron.allow不存在,就寻找/etc/cron.deny文件,写在这个文件中的使用者不能使用crontab,没有被卸载文件中的使用者可以使用crontab。
如果两个文件都不存在,则只有root可以使用crontab。
当用户使用crontab命令建立任务后,任务就会被记录到/var/spool/cron/中,并且以账号来作为判别的。
7.crontab的使用方式
#crontab [-u username] [-l|-e|-r]
选项和参数:
- -u:只有root才能进行这个任务,也可帮助其他使用者建立或删除crontab任务
- -e:编辑crontab的任务内容
- -l:查看crontab的任务内容
- -r:移除所有的crontab的任务内容,若仅移除一项,请用-e去编辑移除。
实例:用root的身份在每天的12:00发信给自己
#crontab -e (使用此命令时也可以不需要指定身份,即不需要加root字段)
0 12 * * * mail -s "at 12:00" root < /home/root/.bashrc
每项任务的格式都具有六个字段,分别的意义为:
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 指令 |
---|---|---|---|---|---|---|
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 | 实际指令 |
特别注意周的数字中的0和7都是代表星期天的意思
另外还有一些辅助的字符,意义如下:
特殊字符 | 代表意义 |
---|---|
* | 表示任何时刻都接受的意思,举例日,月,周都是*的话就代表不论何月何日的星期几都执行。*同样可以使用表1中的数字范围来表示,意义相同。 |
, | 表示分割时段的意思,举例任务时间是每天的3点和6点,则表示为0 3,6 * * * command |
- | 表示一段时间范围内,举例8点到12点之间的每小时的20分钟都执行一次任务,则表示为 20 8-12 * * * command |
/n | n代表数字,表示[每隔n单位间隔]的意思,举例每5分钟执行一次任务,则表示为*/5 * * * * command |
8.crontab的系统配置文件
另外还可以使用编辑/etc/crontab文件的方式,来执行周期性任务。crontab每分钟会读取一次/etc/crontab的任务内容。如果因为某些原因或是其他的Unix系统中,由于crontab是读到内存中的,所有在修改完/etc/crontab文件时,可能并不会马上执行,需要重新启动crond服务。
配置文件中的参数解释:
MAILTO=root 当/etc/crontab文件中的任务指令发生错误时,或者该任务的执行结果有STDOUT/STDERR时,会将错误信息或者屏幕显示的信息传给谁。
PATH=xxx 执行文件的搜寻路径。
[分 时 日 月 周 身份 指令]字段的设定 在/etc/crontab需要指定身份。
9.crond服务读取配置文件的位置
一般情况下,crond预设有三个地方会有执行脚本的配置文件,分别是:
- /etc/crontab
- /etc/cron.d/*
- /var/spool/cron/*
10.可唤醒停机期间的工作任务anacron
什么是anacron:
anacron不是用来取代crontab的,而是用来处理在系统非启动状态下的crontab任务执行的,以及因为某些原因导致的超时而没有没执行的任务。
anacron也是每小时被cron执行一次的,然后anacron再去检测相关的任务有没有被执行,如果有超时的工作在,就执行任务,执行完毕或无需执行任务时,anacron就停止了。
anacron是怎么在停机的状态下还能够执行任务的?anacron会读取时间记录文件,会去分析现在的时间和时间记录文件所记载的上次执行anacron的时间,如果两者有差异,则在某些时刻没有进行crontab,此时anacron会开始执行未进行的crontab任务了。
anacro和/etc/anacrontab:
anacron其实是程序而非服务,在CentOS当中已经进入crontab的任务中,同时anacronb会每小时被执行一次,并且anacron的配置文件放在了/etc/cron.hourly中。
anacron的语法如下:
#anacron [-sfn] [job]
#anacron -u [job]
选项和参数:
- -s:开始连续的执行各项工作(job),会一句时间记录文件的数据判断是否进行。
- -f:强制进行,而不去判断时间记录文件的时间戳。
- -n:立刻进行未进行的任务,而不延迟(delay)等待时间。
- -u:仅更新时间记录文件的时间戳,不进行任何操作。
- job:由/etc/anacrontab定义的各项工作名称。
anacron的配置文件:/etc/anacrontab
RANDOM_DELAY=45 #随机给予最大延迟时间,单位是分钟
START_HOURS_RANGE=3-22 #延迟多少个小时内应该要执行的任务时间
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
- 第一列-天数:anacron执行当下与时间戳(/var/spool/anacron/内的时间记录文件)相差的天数,若超过此天数,就准备开始执行,否则不执行。
- 第二列-延迟时间:若确定超过天数导致要执行任务了,设置延迟执行的时间,防止立即启动会有其他资源冲突的问题。
- 第三列-工作名称的定义:在/var/log/cron中记载该项任务的名称,通常与后续的目录资源名称相同即可。
- 第四列-实际要执行的指令串:即要执行的命令
对于第一个任务,示例具体的执行流程如下:
- 由/etc/anacrontab分析到cron.daily这项工作名称的天数为1天。
- 由/var/spool/anacron/cron.daily取出最近一次执行anacron的时间戳。
- 由上个步骤与目前的时间比较,若差异天数为1天以上(含1天),就准备执行指令。
- 若准备执行指令,根据/etc/anacrontab的设定,将延迟5分钟+3小时(由START_HOURS_RANGE设定)。
- 延迟时间后,开始执行后续指令,即[run-parts /etc/cron.daily]指令。
- 执行完毕后,anacron程序结束。