Bootstrap

Linux计划任务(at/crontab)

linux计划任务(crontab)

一、仅执行一次的定时任务-atd

1. at是个可以处理仅执行一次就结束的定时任务的命令,需要先启动atd服务
2. 启动atd服务

查看atd服务的状态(大部分linux发行版本中atd服务是默认开启的):systemctl status atd

运行状态:

在这里插入图片描述

停止状态:

在这里插入图片描述

​ 如果是atd服务是停止状态,需要使用 systemctl start atd启动atd服务,关闭服务使用systemctl stop atd

​ 将atd服务设为开机启动:systemctl enable atd,移除开机启动项:systemctl disable atd

3. 设置atd定时任务的方法:

使用at命令:

		1. at [-mldv] TIME
      选项与参数:
      -m:当at任务完成后,即使没有输出信息,也发送email通知使用者该任务已完成
      -l:at -l相当于atq,列出目前系统上该使用者所有的at计划
      -d:at -d相当于atrm,取消一个在at计划中的任务
      -v:可以使用较明显的时间格式列出at计划中的任务列表	
      
      TIME:时间格式,设置什么时候执行at定时任务的时间,格式有:
      HH:MM 	在今日的HH:MM时刻执行,若该时刻已超过,则明天的HH:MM时刻再执行此任务			example:04:00
      HH:MM YYYY-MM-DD		强制在YYYY年MM月DD日的HH时MM分执行此任务				example:04:00 2015-07-30
      HH:MM[am|pm] [Month] [Date]			同上      example:04pm July 30
      HH:MM[am|pm]+number [minutes|hours|days|weeks]     某个时间点再加上几[分钟|小时||]后才执行 											example: now+5 minutes  表示现在时间加上5分钟后执行该任务
  		
		2. at -c 任务号码
			选项与参数:
			-c:列出后面任务号码的任务的实际执行命令

例:五分钟后执行at任务

4.at定时任务的其他说明:

4.1 使用at命令创建的定时任务会在放在目录/var/spool/at/下

在这里插入图片描述

​ 创建一个新的at定时任务,/var/spool/at/目录下就会多一个文件,该文件内有该定时任务的详细信息:

在这里插入图片描述

4.2 at定时任务的执行与终端环境无关

​ 所有标准输出或标准错误输出都会通过邮件的方式发送到执行者的邮箱中,所以在终端中不会看到任何信息。可以使用指定数据流输出到终端设备上的方式来将信息打印到屏幕上。如:1.先使用who命令查看当前用户登录的终端名称;2.使用>/dev/pts/0将输出打印到指定终端设备上

在这里插入图片描述

4.3 at定时任务的权限说明

​ 1.先寻找/etc/at.allow这个文件,若该文件存在,则写在这个文件中的用户才能使用at命令,

​ 2.若/etc/at.allow不存在,则寻找/etc/at.deny文件,若该文件存在,则不在此文件中的用户才可以使用at命令。大部分linux发行版本默认只有/etc/at.deny文件,且该文件为空,如果不希望某些用户使用at的话,可以将此用户写入该文件中,一行写一个账号

在这里插入图片描述

说明:/etc/at.deny中的$表示换行符

​ 3.若/etc/at.deny不存在则只有root用户才能使用at命令

二、循环执行的定时任务-crond

1. crontab是个可以处理循环定时任务的命令,需要先启动crond服务

​ 启动方式同atd服务

2.设置crontab定时任务的方法

2.1 root用户和一般用户设置定时任务的方法:crontab命令

			crontab [-u username] [-l|-e|-r]
			选项与参数:
			-u:帮助其他用户建立、删除crontab定时任务,只有root才能使用
			-e:编辑crontab的任务内容
			-l:查看crontab的任务内容
			-r:删除所有的定时任务,若仅要删除某一项定时任务,使用crontab -e编辑,然后在文件中删除

:使用crontab -e设置定时任务

在这里插入图片描述

说明:使用crontab命令设置计划任务后会在目录/var/spool/cron/下生成和用户名同名的文件,该文件内记录了该用户设置的定时任务详情,如root用户设置定时任务后,/var/spool/cron/下多了用户root同名的文件:

在这里插入图片描述

2.2 系统例行性计划任务设置的方法:修改配置文件

配置文件一:/etc/crontab

在这里插入图片描述

在这里插入图片描述

​ SHELL=/bin/bash表示使用/bin/bash执行此文件中计划任务

​ PATH=/sbin:/bin:/usr/sbin:/usr/bin表示执行文件查找的路径

​ MAILTO=root表示此文件中的定时任务如果有标准输出或标准错误输出时,则将标准输出或标准错误输出的内容用邮件的方式通知给root

​ user-name表示指定定时任务的执行用户是谁,因为所有系统例行性计划任务都写在了此文件中,所以需要指定每条定时任务的执行用户

配置文件二:/etc/cron.d/下的所有配置文件

在这里插入图片描述

/etc/cron.d/下的所有配置文件内容都会被crond服务读取,该目录下的配置文件中的计划任务都会被执行,所以可以将自己编写的计划任务文件放到该目录下,配置文件格式可以仿照文件0hourly

在这里插入图片描述

任意月任意日任意时的01分都会执行一次run-parts /etc/cron.hourly

​ 对0hourly文件中内容有如下疑问:什么是run-parts?什么是/etc/cron.hourly?

在这里插入图片描述

​ /etc/cron.hourly是目录,run-parts是命令。run-parts命令:大约在5分钟之内运行某个目录下所有可执行文件。即:任意月任意日任意时的01分后的5分钟之内(每小时)都会执行一次目录/etc/cron.hourly/下的所有可执行文件注意:目录/etc/cron.hourly/下的文件必须全部为能被直接执行的命令脚本文件

也就是说,除了自己指定分、时、日、月、周加上命令路径的crond配置文件外,还可以直接将命令放置到(或链接到)/etc/cron.hourly/下,这样该命令就会被crond在每小时的第1分钟后的5分钟内执行,你无需手动指定分时日月周。此外,/etc/下还有/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/目录,这些目录下的可执行文件在每天、每周、每月都会被执行一次。

在这里插入图片描述

3.cron定时任务的其他说明

3.1 cron定时任务的权限同at定时任务,同样/etc/cron.deny是默认存在的,且内容为空

3.2 周与日月不可同时存在

​ 你可以分别以周或日月为单位作为循环,但是不能使用几月几号且为星期几的模式任务。

3.3 何时使用crontab命令,何时编辑/etc/crontab,何时将文件放置在/etc/cron.d/下?

​ crond服务会主动的读取/etc/crontab、/var/spool/cron/*、etc/cron.d/*下的配置文件,并根据分时日月周的时间设置去配置各项计划任务。

​ 1.个性化的操作时使用crontab -e,如果你是根据个人需求来建立例行计划任务,建议直接使用crontab命令。

​ 2.系统维护管理时使用vim /etc/crontab,如果你这个例行计划任务是系统的重要任务,为了让自己方便管理,同时容易追踪,建议直接写入/etc/crontab中

​ 3.自己开发的软件需要设置定时任务时使用/etc/cron.d/newfile,如果你是想自己开发软件,那当然最好就是使用全新的配置文件,并且放置在/etc/cron.d/目录下

​ 4.固定每小时、每日、每周、每月都要执行的计划任务,想偷懒或是一定要在某个周期内执行的任务,也可以放置到/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/中,直接放置写入命令的可执行文件即可。

三、执行关机期间的未执行的计划任务:anacron

1. anacron可以主动帮你执行时间到了但却因为某些原因没有执行的计划任务
2.anacron的实现原理

anacron命令:

	anacron [-sfn] [job]..
	anacron -u [job]..
	选项和参数:
	-s:开始连续地执行各项任务(job),会根据时间记录文件的数据判断是否执行
	-f:强制执行,而不去判断时间记录文件的时间戳
	-n:立刻执行未执行的任务,而不延迟等待时间
	-u:仅更新时间记录文件的时间戳,不执行任何任务
	job:由/etc/anacrontab定义的各项任务名称

​ anacron通过cron定时任务实现,每小时会主动执行一次anacron命令。既然是每小时执行一次,那么执行anacron命令的脚本应该放置在/etc/cron.hourly/中

在这里插入图片描述

在这里插入图片描述

/var/spool/anacron/cron.daily内容是什么?on_ac_power是什么命令?

在这里插入图片描述

/etc/anacrontab 的内容:

在这里插入图片描述
在这里插入图片描述

period in days的单位是天,delay in minutes的单位是分钟,job-identifier表示任务名称,可自定义,在日志/var/log/cron中记录此任务名称,command表示要执行的命令

​ 什么是nice

在这里插入图片描述

3.anacron执行的流程(以cron.daily为例)

​ 1.由/etc/anacrontab可分析出:cron.daily这项任务的天数为1天

​ 2.从var/spool/anacron/cron.daily中取出最近一次执行anacron的时间戳

​ 3.由上个步骤中取出的时间戳与目前的时间作比较,若差异天数为1天或1天以上就准备执行命令

​ 4.若准备执行命令,根据/etc/anacrontab的设置,将延迟5分钟+3小时(看START_HOURS_RANGE的设置)。

​ 5.延迟时间过后,开始执行后续的命令,即run-parts /etc/cron.daily这串命令

​ 6.执行完毕后,anacron程序结束

4.其他说明

如果想要过期的任务也能被补执行,一定将其放在/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/中

四、系统空闲时才执行的任务:batch

​ 使用batch命令可以创建后台任务,只有当cpu的任务负载小于0.8时才会执行此任务。batch是利用at来执行命令的,只是加入了一些控制参数而已。

1. 设置batch任务的方法
[root@mycentos79 ~]# batch
at> echo "cpu lt 0.8 print this content" > /dev/pts/0
at> <EOT>
job 1 at Wed Oct 19 10:35:00 2022
2.其他说明

当cpu的任务负载小于0.8时并不会立刻执行此任务,因为不管是at还是cron任务,它们的最小时间单位都是分钟,所以,基本上atd服务和crond服务都是每分钟检查一次来处理的,就是整分(秒为0的时候)。

注:本文整理自鸟哥LINUX私房菜-基础学习篇(第四版)

;