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:00
PM
,相当于12:00
),teatime
(下午茶时间,代表4:00
PM,相当于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.deny
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
文件即可。跟
cron
的/etc/cron.allow
和/etc/cron.deny
的逻辑一模一样。 -