at 定时任务

警告
本文最后更新于 2023-10-23,文中内容可能已过时。

at 定时任务

at命令用于指定一个定时任务,在某个特定的时间节点执行一次。相比于cronanacronat命令非常简单易用。

同样的,时间精确度最多也只能到分钟,我估计 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命令的用法

1
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,注意,跟前面的crontabanacron一样,执行命令如果没有重定向到别的地方,命令执行的结果默认会发送到执行人的邮箱,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 unitsnow是现在时刻,n 为数字,units 是单位 (minuteshoursdaysweeks)。同时,你也可以不用 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的逻辑一模一样。

0%