Linux at令详解:定时执行任务

8个月前 (04-28)
要想使用 at 令,读者需提前安装好 at 软件包,并开启 atd 服务。因此,首先来看看如何安装 at 软件包。

在 Linux 系统中,查看 at 软件包是否已安装,可以使用 rpm -q 令,如下所示:

[root@localhost ~]# rpm -q at

at-3.1.13-20.el7x86_64

可以看到,当前系统已经安装 at 软件包,若读者所用系统未安装,可使用如下令进行安装:

[root@localhost ~]# yum -y install at

#省略输出信息,最终出现 Complete!,证明安装成功。


除此之外,at 令要想正确执行,还需要 atd 服务的支持。atd 服务是独立的服务,启动的令如下:

[root@localhost ~]# service atd start

正在启动 atd: [确定]

如果想让 atd 服务开机时自启动,则可以使用如下令:

[root@localhost ~]# chkconfig atd on

当然,独立服务的自启动也可以修改 /etc/rc.local 配置文件,具体怎么做看个人习惯。

安装好 at 软件包并开启 atd 服务之后,at 令才可以正常使用,不过在此之前,我们还要学习一下 at 令的访问控制。

访问控制指的是允许哪些用户使用 at 令设定定时任务,或者不允许哪些用户使用 at 令。大家可以将其想象成设定黑名单或白名单,这样更容易理解。

at 令的访问控制是依靠 /etc/at.allow(白名单)和 /etc/at.deny(黑名单)这两个文件来实现的,具体规则如下:
  • 如果系统中有 /etc/at.allow 文件,那么只有写入 /etc/at.allow 文件(白名单)中的用户可以使用 at 令,其他用户不能使用 at 令(注意,/etc/at.allow 文件的优先级更高,也就是说,如果同一个用户既写入 /etc/at.allow 文件,又写入 /etc/at.deny 文件,那么这个用户是可以使用 at 令的)。

  • 如果系统中没有 /etc/at.allow 文件,只有 /etc/at.deny 文件,那么写入 /etc/at.deny 文件(黑名单)中的用户不能使用 at 令,其他用户可以使用 at 令。不过这个文件对 root 用户不生效。

  • 如果系统中这两个文件都不存在,那么只有 root 用户可以使用 at 令。


系统中默认只有 /etc/at.deny 文件,而且这个文件是空的,因此,系统中所有的用户都可以使用 at 令。不过,如果我们打算控制用户的 at 令权限,那么只需把用户写入 /etc/at.deny 文件即可。

对于 /etc/at.allow 和 /etc/at.deny 文件的优先级,我们做一个实验来验证一下,令如下:

[root@localhost ~]# ls -l /etc/at*
-rw-r--r--.1 root root 1 1月 30 2012 /etc/at.deny
#系统中默认只有at.deny文件
[root@localhost ~]# echo user1 >> /etc/at.deny
[root@localhost ~]# cat /etc/at.deny
user1
#把user1用户写入/etc/at.deny文件
[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
You do not have permission to use at.
#没有权限使用at令,切换成user1用户,这个用户已经不能执行at令了
[user1@localhost ~]$ exit
logout
#返回root身份
[root@localhost ~]# echo user1 >> /etc/at.allow
[root@localhost ~]# cat /etc/at.allow
user1
#建立/etc/at.allow文件,并在文件中写入user1用户
[root@localhost ~]# su - user1
[user1@localhost ~]$ at 02:00
at>
#切换成user1用户,user1用户可以执行at令。这时user1用户既在/etc/at.deny文件中,又在/etc/at.allow文件中,但是/etc/at.allow文件的优先级更高
[user1@localhost ~]$ exit
logout
#返回root身份
[root@localhost ~]# at 02:00
at>
#root用户虽然不在/etc/at.allow文件中,但是也能执行at令,
#root用户虽然不在/etc/at.allow文件中,但是也能执行at令,

#说明root用户不受这两个文件的控制

这个实验说明了 /etc/at.allow 文件的优先级更高,如果 /etc/at.allow 文件存在,则 /etc/at.deny 文件失效。/etc/at.allow 文件的管理更加严格,因为只有写入这个文件的用户才能使用 at 令,如果需要禁用 at 令的用户较多,则可以把少数用户写入这个文件。/etc/at.deny 文件的管理较为松散,如果允许使用 at 令的用户较多,则可以把禁用的用户写入这个文件。不过这两个文件都不能对 root 用户生效。

接下来正式介绍 at 令。at 令的格式非常简单,基本格式如下:

[root@localhost ~] # at [选项] [时间]

有关此令常用的几个选项及各自含义如表 1 所示。

表 1 at 令选项及含义

选项

含义

-m

当 at 工作完成后,无论令是否输出,都用 E-mail 通知执行 at 令的用户。

-c 工作标识号

显示该 at 工作的实际内容。

-t 时间

在指定时间提交工作并执行,时间格式为 [[CC]YY]MMDDhhmm。

-d

删除某个工作,需要提供相应的工作标识号(ID),同 atrm 令的作用相同。

-l

列出当前所有等待运行的工作,和 atq 令具有相同的额作用。

-f 脚本文件

指定所要提交的脚本文件。


另外,表 2 罗列了此令中关于时间参数可用的以下格式。

表 2 at 令时间参数可用格式

格式

用法

HH:MM

比如 04:00 AM。如果时间已过,则它会在第二天的同一时间执行。

Midnight(midnight)

代表 12:00 AM(也就是 00:00)。

Noon(noon)

代表 12:00 PM(相当于 12:00)。

Teatime(teatime)

代表 4:00 PM(相当于 16:00)。

英文月名 日期 年份

比如 January 15 2018 表示 2018 年 1 月 15 号,年份可有可无。

MMDDYY、MM/DD/YY、MM.DD.YY

比如 011518 表示 2018 年 1 月 15 号。

now+时间

以 minutes、hours、days 或 weeks 为单位,例如 now+5 days 表示令在 5 天之后的此时此刻执行。


at 令只要指定正确的时间,就可以输入需要在指定时间执行的令。这个令可以是系统令,也可以是 Shell 脚本。举几个例子。

【例 1】

[coot@localhost ~]# cat /root/hello.sh
#!/bin/bash
echo "hello world!!"
#该脚本会打印"hello world!!"
[root@localhost ~]# at now +2 minutes
at> /root/hello.sh >> /root/hello.log
#执行hello.sh脚本,并把输出写入/root/hello.log文件
at> <EOT>
#使用Ctrl+D快捷键保存at任务
job 8 at 2013-07-25 20:54 #这是第8个at任务,会在2013年7月25日20:54执行
[root@localhost ~]# at -c 8
#查询第8个at任务的内容
...省略部分内容...
#主要定义系统的环境变量
/root/hello.sh >> /root/hello.log

#可以看到at执行的任务


【例 2】

[root@localhost ~J# at 02:00 2013-07-26
at> /bin/sync
at> /in/shutdown -h now
at> <EOT>
job 9 at 2013-07-26 02:00

#在指定的时间关机。在一个at任务中是可以执行多个系统令的

在使用系统定时任务时,不论执行的是系统令还是 Shell 脚本,最好使用路径来写令,这样不容易报错。at 任务一旦使用 Ctrl+D 快捷键保存,实际上写入了 /var/spool/at/ 这个目录,这个目录内的文件可以直接被 atd 服务调用和执行。

表 1 中提到了 atq 令和 atrm 令。atq 令用于查看当前等待运行的工作,atrm 令后者用于删除指定的工作,它们的使用方法也很简单,这里给大家举几个简单的例子。

【例 3】atq 令的用法。

[root@localhost ~]# atq
9 2013-07-26 02:00 a root
#说明root用户有一个at任务在2013年7月26日02:00执行,工作号是9
[root@localhost ~]# atrm [工作号]

#删除指定的at任务


【例 4】atrm 令的用法。

[root@localhost ~]# atrm 9
[root@localhost ~]# atq

#删除9号at任务,再查询就没有at任务存在了