at 定时任务
at 定时任务
at命令用于指定一个定时任务,在某个特定的时间节点执行一次。相比于cron和anacron,at命令非常简单易用。
同样的,时间精确度最多也只能到分钟,我估计 Linux 的定时任务精度最高也只能到分了?如果我想定时在多少秒执行任务怎么办?TODO
准备工作
要想使用 at 命令,读者需提前安装好 at 软件包,并开启 atd 服务
查看 at 软件包是否已安装,可以使用 rpm -q:

这样表示已安装,如果未安装,则需要通过
yum -y install at
进行安装。
除此之外,at 命令要想正确执行,还需要 atd 服务的支持。atd 服务是独立的服务,跟前面的所有服务一样,都有
-
service atd status -
service atd start -
service atd stop -
service atd restart -
service atd reload
这一套命令。
at命令的用法
|
|
-
-m:当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出 -
-I:等同于 atq,获取 at 任务队列 -
-d:等同于 atrm,删除 at 任务 -
-c:打印任务的内容到标准输出 -
-f <文件>:从指定文件读入任务而不是从标准输入读入 -
-v:显示任务将被执行的时间 -
-V:显示版本信息 -
-q <列队>:使用指定的列队 -
-t <时间参数>:以时间参数的形式提交要运行的任务
常用的就是 -f -l -d -c
简单实践:
如果不使用管道|或指定选项 -f 的话,at 的执行将会是交互式的,需要在 at 的提示符下输入命令,输入完成之后,换行 + Ctrl+D 或者两次Ctrl+D,表示输入完毕。

now+1 minutes:表示执行时间为从现在开始之后的第二分钟,
echo hello:输出 hello,注意,跟前面的crontab和anacron一样,执行命令如果没有重定向到别的地方,命令执行的结果默认会发送到执行人的邮箱,at命令的执行人就是定时任务的添加人,也就是说如果添加人是 lk,那么结果就会发送到/var/spool/mail/lk。
输入结束之后会会显示任务 ID 和任务执行时间
邮件:

有时候为了批量执行多个命令,你可以在这里输入对 .sh 文件的调用(要有对这个文件的执行权限)。
不过大部分的时候,为了方便,我们一般都是从文件中读取,文件中可以包含多条指令,指令中可以直接写命令名(比如ls),不需要写命令的全路径(/usr/bin/ls)。因为这里将输出重定向到文件中了,所以不会 lk 不会收到邮件。

然后调用 at -f atfile.txt now+1 minutes

一分钟之后,在相应的文件中即可看到内容,
在任务还未执行的时候,可通过 at -l 或者 atq 查看任务

然后可以直接通过 at -c <任务ID> 查看任务的内容

此时也可以在 /var/spool/at 文件夹中看到对应的文件(只不过文件名和任务 ID 不对应)

查看a00009019f943d的内容其实就是我们通过 at -c <任务ID> 查看到的内容。
在任务还未执行的时候,我们可以删除它,at -d <任务ID>或者atrm <任务ID>

时间表达式
在at命令中,最难掌握的是时间表达式,指定时间的方法很丰富(具体可查看/usr/share/doc/at-3.1.13/timespec),可以是:
-
指定具体执行时间
hh:mm小时:分钟 24 小时制,或者,时间后加 am(上午) 或 pm(下午) 变成 12 小时计时制,当天如果时间已过,则在第二天执行; -
指定具体执行日期:
mm/dd/yy(月/日/年) 或dd.mm.yy(日。月.年);12/2/2021会被识别为 2021 年 12 月 2 号,12.2.2021会被识别为 2021 年 2 月 12 号,注意区别 -
可以同时指定日期和时间
hh:mm mm/dd/yy注意,时间在前,日期在后,这是一种习惯,小的时间写在前面,大的时间写在后面。 -
midnight(深夜,代表
12:00 AM,也就是00:00),noon(中午,代表12:00PM,相当于12:00),teatime(下午茶时间,代表4:00PM,相当于16:00),today,tomorrow等; -
相对计时法:
now + n units,now是现在时刻,n 为数字,units 是单位 (minutes、hours、days、weeks)。同时,你也可以不用 now,-
at -f atfile.txt 5 pm +3 days:表示三天后的下午 5 点执行, -
at -f atfile.txt 5 pm tomorrow:表示明天下午 5 点执行
-
-
无法指定当前以前的时间(废话)。
写的时候可以多试几次,at命令运行之后会在后面输出job id和运行时间,时间不对的话按照job id删掉任务即可
at命令相关文件
-
/var/spool/at用于存储设置好的
at计划任务的目录,可进入该目录下删除相应的计划任务文件;这个在前面了解过了。 -
/etc/at.allow和/etc/at.denyat命令的访问控制是依靠/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文件即可。跟
cron的/etc/cron.allow和/etc/cron.deny的逻辑一模一样。 -
小虾米