计划任务服务
计划任务分为一次性计划任务(at命令)与长期性计划任务(crontab命令):
- 一次性计划任务:任务执行一次后就不存在;
- 长期性计划任务:每隔一定的周期需要执行的任务。
-
一次性计划任务
- 一次性计划任务只执行一次,一般用于满足临时的工作需求,可使用at命令实现该功能。
-
执行at命令时,必须要有atd(单一的例行性工作调度)服务的支持(d:deamon守护进程 <http://blog.csdn.net/woxiaohahaa/article/details/53487602> )。
-
当使用at命令来生成所要运行的一次性计划任务时,会将该工作以文本文件的方式写入/var/spool/at/目录内,等待atd服务的取用与执行。
-
由于安全问题,并非所有用户都可以进行at工作调度。系统会利用/etc/at.allow与/etc/at.deny这两个文件来进行at的使用限制:
- 使用at命令时会进入at shell的环境来让用户下达工作命令。因此最好使用绝对路径来执行相关命令(at在运行时,会切换到下达at指令的那个工作目录。如在/tmp中执行"at now",然后输入"mail root -s "test"<.bashrc",该bash.rc文件将会是/tmp/.bashrc)。
- 由于在at工作调度的使用上,系统会将该项at工作独立出用户的bash环境,直接交给系统的atd程序来接管,因此,当执行了at的工作之后就可以立刻脱机,余下的工作交由Linux管理即可(也就是使用at命令后(at工作后台执行),用户可脱机继续工作)。
- at(executes command at a specified time):在指定的时间执行命令。格式:at [选项] [参数]。
选项
作用
-m
任务执行完成后,即使没有输出信息,仍以邮件email通知用户(若在at shell内的命令没有任何的信息输出,那么at默认不会发Email给执行者)
-l
列出当前系统上该用户的at调度任务列表(相当于atq命令)
-d
删除存在于at调度任务列表中的指定工作(相当于atrm命令)
-v
使用较明显的时间格式列出at调度中的任务列表
-c
列出指定工作的实际命令内容
at命令的执行与终端机环境无关。而所有的标准输出/错误输出都会传送到执行者的mailbox邮箱中,所以直接执行"echo Hello!"并不会显示在终端机上。
若需要将信息显示在终端机屏幕上,可通过who命令查看终端机的设备,再交由输出重定向处理。
at -l或atq查看该用户目前的at工作调度:
at -c 工作号码可显示该项at工作的详细信息(显示结果与cat /var/spool/at/目录内的工作文本文件相同):
at -d 工作号码或atrm 工作号码删除指定工作项:
- batch(分批处理):在指定的时间,当系统不繁忙(CPU工作负载小于0.8(可以使用uptime命令查看系统的负载情况))时执行命令。用法与at类似。
-
长期性计划任务
- 循环执行的例行性工作由cron(crond)服务来控制(默认启动的),可使用crontab命令实现循环型工作调度。
-
为了安全性的问题,与at类似的,会进行用户使用限制:
-
当用户使用crontab命令来新建循环线工作调度之后,该项工作就会被记录到/var/spool/cron/目录中,而且是以账号来作为判别的,但不要使用Vim直接编辑该文件,因为可能会由于输入语法的错误,导致无法执行cron:
另外,cron执行的每一项工作都会被记录到/var/log/cron这个日志文件中,可藉由检查此日志文件来检查是否有"非正常用户设定的cron被执行了",防止系统被植入木马:
-
crontab表达式的六个字段:
("周"的数字为0或7时,都代表"星期天"的意思)
-
注意事项:
- 为避免邮箱不断收到例行性任务的输出讯息(如DNS检测系统中,若DNS长层主机挂掉,那么会一直发送错误信息邮件),此时可利用数据流重定向把结果输出到/dev/null中(> /dev/null 2>&1);
- 如果大量crontab周期任务都在同一时间执行,那么在某个时段,系统将相当繁忙,会造成“系统资源分配不均”的问题:
-
参考: <https://segmentfault.com/q/1010000010790162/a-1020000010790309>
-
-
crontab(计划任务):提交和管理用户的周期性执行的任务。格式:crontab [选项] [参数]。
选项
作用
-u
(管理员身份)创建、编辑其他用户的周期性计划任务
-e
创建、编辑该用户的周期性计划任务
-l
查看该用户当前的周期性计划任务
-r
删除该用户当前所有的周期性计划任务(若仅要删除一项,可用-e去编辑)
crontab -e新建该用户的周期性计划任务:
注意事项:
- 如果在crond服务中需要同时包含多条计划任务的命令语句,应每行仅写一条;
- 因每个用户都只有一个位于/var/spool/cron/目录中的文件来记录crontab工作调度,所以命令一定要用绝对路径的方式来编写(可使用whereis命令查询路径)。
crontab -l查看周期性计划任务:
crontab -r删除周期性计划任务文件(全部的计划工作都会被删除,若仅想删除某一项工作,则需要使用crontab -e去编辑计划任务)
crontab -u 用户名 [-ler]管理员帮助其他用户查看、创建编辑或删除周期性计划任务:
-
系统的例行性任务配置文件:/etc/crontab。cron会每分钟去读取一次/etc/crontab与/var/spool/cron/中的数据内容。若要修改或增加系统的例行性命令,可以root身份直接编辑/etc/crontab文件并保存,cron的设定会自动执行(但会由于crontab是读到内存当中的,所以在修改完/etc/crontab之后,可能不会立刻执行,需重新启动cron服务"systemctl restart crond")。
-
注意事项:
- 为避免邮箱不断收到例行性任务的输出讯息(如DNS检测系统中,若DNS长层主机挂掉,那么会一直发送错误信息邮件),此时可利用数据流重定向把结果输出到/dev/null中(> /dev/null 2>&1);
-
如果大量crontab周期任务都在同一时间执行,那么在某个时段,系统将相当繁忙,会造成"系统资源分配不均"的问题:
-
-
一般来说,cron服务预设有三个地方会有执行脚本配置文件:/etc/crontab、/etc/cron.d/*、/var/spool/cron/*。其中跟系统的运行相关的配置文件是存放在/etc/crontab文件内以及/etc/cron.d/目录内的文件;跟用户自设工作相关的配置文件则放在/var/spool/cron/中的文件群:
run-parts是一个shell script/脚本(可使用"which run-parts"查看路径),会将寻找其后接目录内的所有可执行文件,并在大约5分钟内执行指令任务(而不是分、时、日、月、周的设定值)
而/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/,分别代表每日、每周、每月各执行一次的意思,它们与anacron有关:
-
个人化的行为建议使用"crontab -e",根据个人需求来建立例行性计划任务(保存在/var/spool/cron/目录中),因为/etc/crontab文件是可以被所有用户读取的:
- 系统维护管理建议使用"vim /etc/crontab"来创建例行工作排程,直接写入/etc/crontab管理方便易追踪。
- 自行开发的软件建议使用"vim /etc/cron.d/newfile"来创建全新的配置文件。
- 固定每小时、每日、每周、每天执行的特别工作,也可以放置到/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/中。
- 对于非24小时启动的LInux系统的crontab执行,以及因为某些原因导致的超过时间而没有被执行的排程工作,须依靠anacron命令的功能。anacron预设会以一天、七天、一个月为期去侦测系统未进行的crontab任务。
- anacron会通过读取时间记录文件(timestamps),来获知系统的关机时间,然后去分析当前时间与时间记录文件所记载的上次执行anacron的时间,两者比较后若发现有差异,则代表在某些时刻没有进行crontab,此时anacron就会开始执行未进行的crontab任务。
-
anacron是一支程序而并非一个服务,它在CentOS中已经属于crontab的调度,同时anacron会每个小时被主动执行一次,其配置文件为/etc/cron.hourly/0anacron(为了防止anacron误判时间参数,/etc/cron.hourly/中的anacron会在文件名前加"0"(0anacron),表示让anacron优先进行,更新时间戳)
-
anacron(anachronistically过时地)的语法:
-
anacron的配置文件:/etc/anacrontab
天数:anacron分析当下与时间戳(/var/spool/anacron/内的时间记录文件)相关的天数,若超过此天数,就准备开始执行指令,若没有超过此天数,则不予执行后续的指令;
延迟时间:如果已确定超过天数而导致要执行排程工作,那么将延迟多久后开始执行,因为若立即启动该项工作可能会产生资源冲突的问题;
工作名称定义:记录在/var/log/cron中该项任务的名称,通常与后续的目录资源名称相同即可;
指令串:通过run-parts来处理(与/etc/cron.d/0hourly类似)。
-
anacron的执行流程:
如此一来,放置在/etc/cron.daily/内的任务会在一天后被执行。由于anacron是每个小时被执行一次,因此,开机过后约1小时左右系统会有一小段忙碌的时间,硬盘使用率会比较高,anacron会执行过去/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/中的未进行的各项工作排程。
-
crond与anacron的关系:
- cron会主动去读取/etc/crontab、/var/spool/cron/*、/etc/cron.d/*等配置文件,并依据"分、时、日、月、周"的时间设定去各项工作排程;
- 根据/etc/cron.d/0hourly的设定,会主动去/etc/cron.hourly/目录下,执行所有在该目录下的执行文件;
- 因为/etc/cron.hourly/0anacron这个脚本文件的缘故,系统主动的每小时执行anacron,并呼叫/etc/anacrontab的配置文件;
- 根据/etc/anacrontab的设定,依据每天、每周、每月去分析/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/内的执行文件,以进行固定周期需要执行的指令。