作者:俺是胖墩墩_499 | 来源:互联网 | 2023-08-18 10:39
背景知识:对于一些即将发生的任务或者在未来一段时间内需要重复执行的任务,在Linux系统下可以通过两个任务管理工具at(在某个时间点执行一次)和crontab(在设定的时间范围内重复执行)来实现。
背景知识: 对于一些即将发生的任务或者在未来一段时间内需要重复执行的任务,在Linux系统下可以通过两个任务管理工具at(在某个时间点执行一次)和crontab(在设定的时间范围内重复执行)来实现。
工具介绍:(1)at at是仅执行一次任务的指令,依赖于atd服务;默认情况下,在centos中该服务开机自启
在centos6中,可使用命令service atd status查看atd服务的运行状态,此项操作一般在编辑某个at任务前进行
出于安全方面的考虑,etc目录下有两个文件,/etc/at.allow与/etc/at.deny,前者为at任务的白名单,后者为at任务的黑名单。默认情况下,只有at.deny文件存在,且内容为空。如果将指定用户名信息写入该文件,则这些用户无权使用at命令设置计划任务。若两个文件同时存在,系统将自动忽略deny文件,以allow文件内的设置值为准,存在于allow文件内的用户才有权限使用at命令;特别地,当两个文件都存在,且allow文件为空时,或者两文件均不存在时,只有root能调用at命令。
at [-mldv] TIME
-m:at任务结束后以邮件方式告知用户
-l:列出当前系统中所有at任务,相当于atq
-d NUM:删除指定号码的at任务,atrm NUM
-v:用较明显的时间格式列出at任务列表
-c NUM:查看指定编号的at任务详细信息
TIME的时间格式:
HH:MM [YYYY-MM-DD]
特别的,TIME部分可设置为:now + 5 minutes
如图列所示,执行at命令时,会进入一个shell命令环境,可写入需要执行的命令,注意at的执行于终端环境无关,是放在后台执行的任务(atd接管),终端机不会有任何输出;
at任务的队列位于/var/spool/at目录下,当用户用at命令创建任务后,会在此目录下生成一个临时文件,当at任务执行完毕,此文件被atd服务删除。
(2)crontab crontab是可以按照分钟/小时/天/月份/周 等时间间隔循环执行的指令,依赖于crond服务,同样默认为开机自启;除了通过命令crontab -e实现外,也可编辑/etc/crontab来支持。
类似地,同样存在/etc/cron.allow和/etc/cron.deny两个文件,系统对这两个文件的设置相似于at文件;cronie这个主程序包提供了crond守护进程以及辅助工具,cronie有一个补充程序cronie-anacron,用来监控cronie任务的执行状况,由于关机等因素导致的未能正常执行的任务,anacron会随后执行一次;crond服务默认也是开启的,同样的,在centos6中通过以下方式查看:
当用户使用crontab命令创建计划任务后,会在/var/spool/cron目录下创建用户名文件,cron任务每执行一次,都会被记录在/var/log/cron中。以下是crontab命令格式(用户级cron任务)
crontab[-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务
参考/etc/crontab文件,当用户用crontab -e编辑cron任务时,会自动用vim打开一个文本文件,在此文件内进行编辑:
前五个用‘*’标识的字段含义为“分、时、日、月、周”,实际编辑时只能用数字填充,特别地,在周字段上,0/7均表示周日;后续部分接命令,命令本身需要用绝对路径表示(例:/usr/bin/echo)
如果下达的工作是3:00与6:00执行则为
0 3,6 * * * command
如果下达的工作是8点到12点之间,每小时的20分钟进行一项工作
20 8-12 * * * command
每五分钟进行一项工作
*/5 * * * * command
编辑完保存退出即可。此时/var/spool/cron目录下对应的生成以用户名名命的文件;如果设置了多个cron任务,统一删除用crontab -r 清除所有;crontab -e进入文本编辑后,删除指定的行,保存并退出即可输出某项cron任务!
下面介绍系统级cron任务的处理办法:
**root身份编辑/etc/crontab文件,crond进程会每分钟读一次/etc/crontab以及/var/spool/cron里面的数据,只要完成/etc/crontab文件的编辑,系统级cron任务就开始执行了。
注意,MAILTO字段可以定义邮件通知的对象,当cron任务执行出错时,会根据此字段定义的邮件地址,由系统发送邮件进行通知;此外,user-name字段需写上用户名,默认系统级任务以root身份运行
看下/etc/cron.d/0hourly文件:
观察最后一行,每整点的1分执行run-parts /etc/cron.hourly,run-parts可简单理解为调用脚本并执行之意,后面跟的是可执行脚本的绝对路径,实际效果是每整点的1分后,5分钟内随机选一个时间点执行/etc/cron.hourly下的脚本;
事实上,/etc/cron.daily /etc/cron.monthly /etc/cron.weekly三个目录同样存在,只不过被接下来要说明的anacron任务调用罢了:
anacron程序被crond进程每小时执行一次,anacron再去检测cron任务是否被执行,超期未执行的便执行,无则停止。它按天/周/月侦测未进行的cron任务;
脚本路径:/etc/cron.hourly/0anacron
配置文件路径:/etc/anacrontab