Linux基础知识 ·

Linux定时任务

Linux 任务调度种类:

单一任务:at命令,仅执行一次,必须要有atd服务支持。

循环任务:crontab命令,定时循环。

单一任务

使用单一任务调度时,必须要有atd这个调度服务的支持。不过有的系统未默认开启此服务,可能需要我们手动启用。

centos 7:

centos 6:

at的运作方式:

使用at命令生成所需运行的工作,并将这个工作以文本文件的方式写入/var/spool/at/目录内,该工作才能被atd服务调取并执行。

at 和 batch 从标准输入或一个指定的文件读取命令,这些命令在以后 某个时间用 /bin/sh 执行。

at的使用限制管理:

/etc/at.allow:白名单,只有此名单内用户可以使用at。

/etc/at.deny:黑名单,此名单内用户无法使用at,其他用户可用(优先读取at.allow,若此文件不存在,则读取at.deny;若at.deny为空,则所有用户都可执行at。【默认】)。

若两个文件都不存在,则只有root可以使用at。

at:实行单一任务调度

at 选项 参数 时间 

常用参数:

-q:使用指定的队列。一个队列用一个字母标定,有效的的队列标定的范围是从a到z和从A到Z。

-m:当作业完成时即使没有输出也给用户发邮件。

-f FILE:从文件而不是标准输入中读取作业信息。

-l:列出用户的等待执行的作业;在用户是超级用户的情况下,列出所有人的作业(atq别名)。

-d:删除作业(atrm别名)。

-v:显示完整的在队列中未被删除的作业,对于其他命令,显示作业将要执行的时间。

-c:连接命令行中列出的作业并输出到标准输出。

时间格式:定义何时进行at这项工作。

HH:MM     如:04:00

当天何时进行,若已过此时间,则推迟至下一天的此时。

HH:MM YYYY-MM-DD  如:05::00 2016-11-16

定义于某年某月某日某时某分执行此任务。

HH:MM + number [minutes|hours|days|weeks]  如:06:00 + 5 hours  或 now + 5 minutes

定义于当天某时刻后多长时间执行,now + 表示当前时刻多少时间后。


当使用at命令时,会进入一个at shell 的环境来让用户执行工作命令,此时,最好使用绝对路径来执行命令。由于命令的执行与PATH变量有关,同时与当时的工作目录有关,因此使用绝对路径来执行命令会比较安全。

如:在/tmp 下执行“at now” 然后输入“mail root -s "test” <.bashrc",此时at会在当前工作目录寻找 .bashrc .

at命令的所有标准输出与标准错误输出都会以email发送给用户。

at命令的执行内容是在后台执行,所以不用担心终端断开而导致任务中断。

示例:添加定时关机

查询正在排队的任务

查看第一个任务

删除第一个任务

batch:闲时执行

其实 batch 还是利用 at 来执行任务的,只是加入了一些控制参数,其用法与 at 一样,不过他能在CPU的负载小于0.8的时候才执行指定的工作任务。

循环任务

循环任务调度是由cron(crond)这个系统服务控制的,Linux上的很多默认任务都是这个服务在控制者,因此这个服务都是默认启动的。用户可以使用 crontab 来管理调度循环任务。

crontab的运作方式:

当用户使用 crontab 创建工作后,该项工作会被记录到/var/spool/cron/里面,而且是以账号最为判别的,crontab执行的每一项工作都会被记录到 /var/log/cron 这个日志文件中。

/etc/cron.allow:白名单,只有此名单内用户可使用crontab。(优先高,若此文件在,则不读黑名单。)

/etc/cron.deny:黑名单,此名单内用户无法使用crontab,其他用户可用。

crontab:实行循环任务调度

crontab 选项  创建任务

常用选项:

-u:指定用户创建任务,只有root可用。

-e:编辑crontab的工作内容。

-l:查阅crontab的工作内容。

-r:删除所有crontab的工作内容,若要删除一项用 -e 编辑。

代表意义 分钟 小时 日期 月份 命令
数字范围 0-59 0-23 1-31 1-12 0-7 执行的命令

其中周的定义里,“0”或者“7”都代表了星期天。

特殊字符含义:

特殊字符 代表意义
*(星号) 代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * , 就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!
,(逗号) 代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 与 6:00 时,就会是:

0 3,6 * * * command

时间参数还是有五栏,不过第二栏是 3,6 ,代表 3 与 6 都适用!

-(减号) 代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:

20 8-12 * * * command

仔细看到第二栏变成 8-12 !代表 8,9,10,11,12 都适用的意思!

/n(斜线) 那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:

*/5 * * * * command

很简单吧!用 * 与 /5 来搭配,也可以写成 0-59/5 ,相同意思!

系统任务 /etc/crontab

这个文件是系统默认会定时执行的系统任务,cron 服务会每隔一分钟读取/etc/crontab与/varspool/cron里面的内容。

SHELL=/bin/bash:使用的shell,还记得脚本文件的#!/bin/bash不。

PATH=……:定义路径到变量。

MAILTO=root:若有额外STDOUT,以 email 将数据发送给谁,可以改成你的email地址,以便接收任务的执行信息。

其中比crontab -e 命令多了一项,便是用户名称了,因为用户执行命令会以用户身份生成配置文件,而这个文件中若是填入任务的话,系统就需要指定用户的身份了。

并且其中还支持以目录来规划任务,可以将可执行文件放在一个目录中,然后再命令处填写 run-parts(有空格)然后接上目录,即可借助run-parts这个脚本的辅助,来规划目录执行了。

其中所有的输出会以email形式,发送预设的账号,所以不必要的输出可以重定向给/dev/null 避免垃圾邮件。

其中日、月、周不可同时存在,若是同时存在,系统默认执行第一个读取到的时间做循环。

anacron

crontab的任务都是定时循环执行,若是那个时刻处于关机状态,那么任务就无法执行了,为了弥补这个问题,就有了anacron。其能够将为能运行的crontab工作在开机之后执行。

aracron也是基于crontab来运行的,因此aracron运行的时间通常有两个,一个是系统开机期间运行,一个是写入crontab 的调度之中,这样才能够在特定的时间分析系统中未运行的crontab 工作。

anacron 选项 工作

常用选项:

-s:开始连续执行各项crontab未能执行的任务(根据时间记录判断)。

-f:强制执行任务而不去判断。

-n:立即执行未执行的任务,而不延迟等待时间。

-u:仅更新时间记录文件,而不进行任何工作。

任务:由/etc/anacrontab 定义的各项任务名称。

参与评论