原创

Linux 任务计划及周期性任务计划

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44023707/article/details/96101394

什么叫任务计划及周期性任务计划

任务计划:在未来的某时间点执行一次某任务
周期性任务:在每个周期运行一次某任务

在未来的某时间点执行一次某任务的相关命令:at,batch
周期性任务命令:crontab

任务执行结果会以通过邮件的方式发送给用户
邮件是指本地电子邮件服务

查看本地电子邮件服务是否开启

netstat -tnlp(查看是否监听 25 端口)
ss -tnl(查看是否监听 25 端口)

本地电子邮件服务

smtp:simple mail transmission protocol
pop3:post office protocol
imap4:Internet mail access protocol

mail命令

作用:用户收发邮件的工具程序
用法:mail [ -s "SUBJECT" ] USERNAME[@HOSTNAME]
	SUBJECT:邮件主题
	USERNAME:本地用户
	@HOSTNAME:主机名;本地系统可省略

	邮件正文的生成:
		(1)交互式输入;点号单独成行可以表示正文结束;或者 Ctrl+d 提交亦可
		(2)同构输入重定向
		(3)通过管道

at命令

要想使用 at 命令,提前安装好 at 软件包,并开启 atd 服务。
查看 at 软件包是否已安装:
	# rpm -q at
如果未安装就使用以下命令安装:
	# yum install -y at
除此之外at命令想要正确执行,还需要 atd 服务的支持。atd 服务是独立的服务,启动命令如下:
	# service atd start
如果想让 atd 服务开机时自启动,则可以使用如下命令:
	# chkconfig atd on
当然,独立服务的自启动也可以修改/etc/rc.local配置文件。

在使用之前先学习一下 at 命令的访问控制
访问控制指的是允许哪些用户使用 at 命令设定定时任务,或者不允许哪些用户使用 at 命令。将其理解为黑名单和白名单。
at命令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件实现的,具体规则如下:
(1)如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件中的用户可以使用 at 命令,其他用户不能时候用 at 命令(注意:/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入了 /etc/at.allow 文件,又写入了 /etc/at.deny 文件,那么这个用户可以使用 at 命令)
(2)如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件中的用户不能使用 at 命令,其他用户可以使用 at 命令。不过这个文件对 root 用户不生效。
(3)如果系统中两个文件都不存在,那么只有 root 用户可以使用 at 命令。
系统中默认只有 /etc/at.deny文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 命令。不过,如果我们打算控制用户的 at 命令权限,那么只需要把用户写入 /etc/at.deny 文件即可。

用法:at [OPTION]... TIME
TIME:
	HH:MM  [YYYY-mm-dd]
	noon,midnight,teatime
	tomorrow
	now+#
		UNIT(单位):minutes,hours,days,OR weeks

	at的作业有队列,用单个字母表示,默认都使用a队列
	
	常用选项:
		-l:查看作业队列,相当于 atq
		-f /PATH/TO/SOMEFILE:从指定文件中读取作业任务,而不用再交互式输入
		-d #:删除指定的作业,相当于 atrm
		-c #:查看指定作业的具体内容
		-q QUEUE:指明队列

	注意:作业执行结果一是以邮件发送给提交作业的用户

batch命令

作用:batch会让系统自行选择在系统资源较空闲的时间的去执行指定任务
用法和at一样

周期性任务计划:cron

在实际工作中,系统的定时任务一般是需要重复执行的。而 at 命令显然无法满足需求,这就需要使用 crontab 命令来执行循环定时任务。

服务程序:
	cronie:主程序包,提供了 crond 守护进程及相关辅助工具

crontab命令需要crond服务支持。crond 是 Linux 下用来周期的执行某种任务或等待处理某些事件的一个守护进程,和 Windows 中的计划有些类似。crond进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务

	确保 crond 守护进程(daemon)处于正常运行状态
		Centos 6:service crond status
		Centos 7:systemctl status crond.service

该命令和at命令类似,也是通过 /etc/cron.allow 和 /etc/cron.deny 文件来限制某些用户是否可以使用 crontab 命令的。而且原则也非常相似:
(1)当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高。
(2)当系统中有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令。
(3)这个规则基本和at命令的规则一致,同样是 /etc/con.allow 文件比 /etc/cron.deny 文件的优先级高,Linux系统中默认只有 /etc/cron.deny 文件。

	向 crond 提交作业的方式不同于 at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,需要使用 crontab 命令

	cron任务分为两类:
		系统 cron 任务:主要用于系统自身的维护
			手动编辑:/etc/corntab文件

		用户 cron 任务:
			命令:crontab命令

系统cron的配置格式

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
			
注意:
	(1)每一行定义一个周期任务,共7个字段
				* * * * *:定义周期性时间
				user-name:运行任务的用户身份
				command to be excuted:任务
	(2)此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量
	(3)执行结果邮件发送给 MAILTO 指定的用户

用户 cron 的配置格式

文件:/var/spool/cron/USERNMAE
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
# |  |  |  |  |
# *  *  *  *  *  command to be executed
		
注意:
	(1)每行顶一个 cron 任务,共6个字段
	(2)此处的环境变量不同于用户登录后获得的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量
	(3)邮件发送给当前用户

时间表示法

(1)特定值:
	给定时间点有效取值范围内的值
	注意:day of week 和 day of month 一般不同时使用
(2)*:给定时间点上有效取值范围内的所有值;表示“每”
(3)离散取值:,
	在时间点上使用逗号分隔的多个值
		#,#,#
(4)连续取值:-
	在时间点上使用 - 连接开头和结束
		#-#
(5)在指定时间范围上,定义步长:/
	*/#:#即步长
	注意:
		(1)步长不能被指定时间点整除时,其意义将不复存在
		(2)最小时间单位为“分钟”,想完成“秒”级任务,得需要额外借助其它机制
			定义每分钟任务,而再利用脚本实现在每分钟之内,循环执行多次

示例:
	(1)3 * * * *:每小时任务,每小时的第3分钟执行一次
	(2)3 4 * * 5:每周任务;每周5的4点3分执行一次
	(3)5 6 7 * *:每月任务;每月的7号6点5分执行一次
	(4)7 8 9 10 *:每年任务;每年的10月9号8点7分执行一次
	(5)9 8 * * 3,7:每周三和周知的8点9分执行一次
	(6)0 8,20 * * 3,7:每周3和周日的8点和20点执行一次
	(7)0 9-18 * * 1-5:每周一至周五的9点-18点每小时执行一次
	(8)*/5 * * * *:每5分钟执行一次某任务

crontab命令

用法:crontab [-u user] [-l | -r | -e] [-i]
选项:
	-e:编辑任务;自动打开文本编辑器
	-l:列出所有任务
	-r:移除所有任务;即删除crontab文件;/var/spool/cron/USERNAME文件
	-i:在使用 -r 选项移除所有任务时提示用户确认
	-u USER:root用户可为指定用户管理cron任务
注意:运行结果以邮件方式通知给当前用户;如果拒绝接受邮件
	(1)COMMAND > /dev/null  #当任务执行正确时就不发送邮件
	(2)COMMAND &> /dev/null #当任务执行不管是否正确都不发送邮件

注意:定义 COMMAND 时,如果命令中需要用到 %,需要对其转义,但放置于单引号中的 % 不用转义亦可

思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?
	答:不会,会等待下一个时间点再执行
	如果期望某时间点因故障未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron命令实现

anacron命令

anacron 使用来做什么的呢?假设,Linux服务器会在周末关机两天,但是设定的定时任务大多在周日早上进行,但在这个时间点,服务器又处于关机状态,导致系统定时任务无法运行。
又比如,我们需要再凌晨 5 点 05 分执行系统过的日志备份,但Linux服务器不是24小时开机的,在晚上需要关机。白天上班之后才会再次开机,在这个定时任务的执行时间我们的服务器刚好没有开机,那么这个定时任务就不会执行了。anacron 就是用来解决这个问题的。

anacron 会以 1 天、1周(7天)、一个月作为检测周期,判断是否有定时任务在关机之后没有执行。如果有这样的任务,那么 anacron 会在特定的时间重新执行这些定时任务。

那么,anacron 是如何判断这些定时任务已经超过执行时间的呢?这就需要借助 anacron 读取的时间记录文件。anacron 会分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,将两者进行比较,如果两个时间的差值超过 anacron 的指定时间时间差值(一般是 1 天、7天、一个月)就说明有定时任务没有执行,这是 anacron 会介入并执行这个漏掉的定时任务,从而保证在关机时没有执行的定时任务不会被漏掉。

在Centos 6 中,使用 cronie-anacro 软件包取代了 vixie-cron 软件包。而且在原先 Centos 版本的 /etc/cron.{daily,weekly,monthly} 目录中的定时任务同时被 cron和anacron调用,这样非常容易出现重复执行同一个定时任务的错误。因此,在 Centos 6 中,/etc/cron.{daily,weekly,monthly} 目录中的定时任务只会被 anacron 调用,从而保证这些定时任务只会在每天、每周或每月定时执行一次,而不会重复执行。

不仅如此,在 Centos 6 中,anacron 还有一个变化,那就是anacron 不再是单独的服务,而变成了 系统命令。也就是说,我们不再使用“service anacron restart”命令来管理 anacron 服务了,而需要使用 anacron 命令来管理 anacron 工作。

anacron命令的用法:
	anacron [OPTION] [工作名]
	这里的工作名指的是依据 /etc/anacrontab 文件中定义的工作名。
	选项:
		-f:强制执行相关工作,忽略时间戳
		-u:更新 /var/spool/anacron/cron.{daily,weekly,monthly} 文件中的时间戳为当前日期,但不执行任何工作
		-s:依据 /etc/anacrontab 文件中设定的延迟时间顺序执行工作,在前一个工作未完成前,不会开始下一个工作
		-n:立即执行 /etc/anacrontab 中所有的工作,忽略所有的延迟时间
		-q:禁止将信息输出到标准错误,常和 -d 选项合用
展开阅读全文

没有更多推荐了,返回首页

博客模板©2019 由CSDN提供 模版主题为:skin-blackboard by CSDN官方博客 设计