王继敏
【摘 要】在Linux系统运维过程中,经常会遇到需要定时或周期性的执行一些命令或脚本的情况,利用Linux系统提供的定时任务机制可以实现这一功能。对Linux下实现定时任务的几种不同方式进行探讨,给出了在不同方式下实现定时任务的一些具体实例。
【关键词】Linux;定时任务
0 引言
在实际生产环境中,经常需要定时或周期性的执行一些命令或者脚本程序,如在指定时间对系统的用户访问量进行统计、定期清理临时文件、定期对日志文件进行分析汇总等等。此时可以使用Linux提供的定时任务机制来满足这种需求。这种定时任务可以分为需要周期性反复执行的定时任务和仅执行一次的定时任务两类,本文分别对这两种定时任务的实现给出描述,并简要介绍在使用过程中需要注意的事项。
本文所述的命令、配置文件等都基于RHEL6.3(Redhat Enterprise Linux 6.3),不同Linux发行版之间或许有细微的差别,这些差异不在本文的探讨范围之内。
1 一次性定时任务
1.1 at简介
某些任务调度可能是突发的、临时性的、一次性的任务,如在凌晨某时刻对系统执行一次升级。这种情况可以使用at命令实现。at既可以接收来自stdin的命令,也接收预先写在文件中的命令。而at的定时任务能夠得以实现,必须要事先启动atd系统服务。[1]
如果RHEL6.3是采用最小化方式安装的,则at和atd都是没有安装的,可以通过以下命令安装之。
# yum install at
接下来查看一下atd服务的状态,将其启动。
# service atd status
atd is stopped
显示上面这条信息表示atd服务还没有开启,此时是无法执行at定时任务的,通过以下命令将其开启。
# service atd start
此后便可以使用at命令设置定时任务了。
1.2 at语法及注意事项
at命令的语法可以分为两种形式,分别是:
(1)at [-f] time
(2)at [options]
at命令的第一种形式会从stdin或者file文件读取命令,将命令排入队列,使其于指定时间(time)执行,这里的时间既可以是绝对时间如12:00,也可以是相对时间如now+3 minutes等;第二种形式可以列出(使用-l选项)或者删除(使用-d选项)队列中的任务。设置成功的at计划任务会在/var/spool/at下生产一个可执行脚本。例如在凌晨2点对磁盘sdb1执行一次磁盘检查任务:
# at 2:00
at> fsck /dev/sdb1
需要注意的是,at的执行与终端环境无关,所有的standard output和standard error都会发送到执行者的邮箱里,当然前提是当前主机已经安装并配置好了邮件系统。另外需要注意的是,at通过/etc/at.deny和/etc/at.allow提供了访问控制措施,以决定哪些用户可以使用调度服务。如果这两个文件都不存在,则只有root管理员可以使用at;如果只有at.deny文件,而at.allow文件不存在,则除了黑名单之外的所有用户都可以使用at;如果at.allow文件存在,则只有白名单用户才可以使用at。
2 周期性定时任务
2.1 cron简介
另一类任务调度是例行性的,即每隔一定的周期要来办的事项,这类定时任务需要使用cron来实现。Linux系统本身就有许多需要循环执行的例行性任务,如对日志文件进行轮替(log rotate)、定期清理/tmp目录下的临时文件、定期建立locate数据库等。Cron是一个系统服务,即使RHEL6.3是最小化安装,这个服务也是安装和开启的。例如下面这条命令:
# service crond status
crond (pid 1032) is running...
上面一行输出信息表示当前定时器服务crond正在运行。
2.2 crontab命令及配置文件
用户可以使用crontab命令设定或者查看定时任务。该命令的主要用法如下:
(1)crontab -l [-u usrer] 列出某个用户cron服务的详细内容
(2)crontab -r [-u usrer] 删除某个用户的cron服务
(3)crontab -e [-u usrer] 编辑某个用户的cron服务[2]
例如,系统管理员想删除Tom用户的定时任务,可以如下操作:
# crontab -u Tom -r
当crontab使用-e参数时,会自动打开vi编辑器,可以按照规定语法格式编辑定时任务。其语法格式为:
Minute Hour Day Month Week Command
分钟 小时 天 月 星期 命令
其中Minute的取值范围为0-59,Hour的取值范围为0-23,Day的取值范围为1-31,Month的取值为1-12,Week的取值为0-7(0和7都表示星期日),Command即为周期性执行的命令或者脚本。
在以上任何值中,星号(*)可以用来代表所有有效的值,譬如月份值中的星号意味着在满足其它制约条件后每月都执行该命令;整数间的短线(-)指定一个整数范围,譬如1-4 意味着整数1、2、3、4;用逗号(,)隔开的一系列值指定一个列表,譬如3, 4, 6, 8标明这四个指定的整数;正斜线(/)可以用来指定间隔频率,在范围后加上 / integer意味着在范围内可以跳过 integer,譬如0-59/2 可以用来在分钟字段定义每两分钟;间隔频率值还可以和星号一起使用,例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务;开头为井号(#)的行是注释,不会被处理。例如用户Tom为自己安排一个定时任务,每天删除/home/Tom/log目录下五天前的文件,可以如下编辑:
0 2 * * * find /home/Tom/log -type f -mtime +5 -exec rm {} \;
用户编辑好的定时任务,会保存在/var/spool/cron目录下的一个和用户名同名的文件中,这就是用户级定时任务的配置文件。还有一类定时任务是系统级定时任务,通常用于系统的例行性任务调度,这类定时任务的配置文件保存在/etc/crontab文件中,可以直接以root用户身份打开编辑。其配置文件格式与用户级定时任务配置文件的格式类似,只不过在Week和Command两项之间,多了一个User项,即执行者身份——定义该任务以什么用户身份执行。
和at命令类似,也可以通过编辑/etc/cron.allow和/etc/cron.deny文件,来允许/禁止用户设置定时任务。编辑完黑名单或者白名单后,需要重启crond服务以使之生效。
3 anacron机制
无论是at定时任务还是cron定时任务,都要求在指定的时刻系统必须是开机的。这对于生产环境中24小时不间断运行的服务器而言自然不是问题,但在一些桌面和工作站使用环境中则很难做到,如果在任务预定执行的那一刻系统是关机的,则定时任务失效。而anacron就是为处理非24小时一直在线的Linux系统的定时任务而设计的。
anacron并非是取代cron,而是cron的补充。anacron并不能指定在何时执行某任务,而是以天为单位或者开机后立刻检查停机期间应该但是没有执行的cron任务,并将这些任务执行一遍。
4 结束语
通过利用Linux系统提供的at和cron机制,可以方便的安排一些临时性或周期性的任务在指定时间执行,正确而合理的使用Linux的定时任务机制可以有效的提高系统运维的效率。
【参考文献】
[1]鸟哥.鸟哥的Linux私房菜基础学习篇[M].第三版.北京:机械工业版社,2010:493-494.
[2]陈素琴.Linux中的定时任务探讨.现代计算机,2010.11:70-71.endprint