at是一个命令行程序,可让您安排在指定时间执行的命令。与crontab不同用at创建的任务仅执行一次。

在本教程中,说明如何使用at及其配套程序batchatqatrm查看,删除和创建作业/定时任务。

某些发行版at可能会预安装在你的Linux系统上,这取决于你使用的Linux的系统。如果未安装at,则可以使用发行版的软件包管理器轻松安装它。

如果你使用的是Ubuntu,Linux mint或者基于Debian的Linux发行版,你可使用命令sudo apt install at安装at

如果你使用的是CentOS,Fedora或者基于Redhat的Linux发行版,你可使用命令sudo yum install at安装at

如果你完成了at程序的按,请确保atd服务已启动,并将其设置为在启动时启动。使用命令sudo systemctl enable --now atd

这是at命令的基础语法形式at [OPTION...] runtimeruntime是脚本要使用解释器,你可指定脚本的任何解释器。默认是/bin/sh。当前你可以指定为bash shell。

当您要创建定时任务时,at命令将日期和时间传递到runtime,并从标准输入中执行命令。

除了在at提示符下输入命令外,还有另一种方式可以传递您要运行的命令。这种方法是使用echo将命令通过管道传递给at

at命令也可从文件而不是标准输入中读取命令,你可使用-f选项指定文件路径。

at示例

让我们创建一个将在上午9:00运行的定时任务,按下Enter后,系统会显示at命令提示符,通常以at>开头。

您还会看到一条警告,告知您运行命令将会使用的shell解释器。输入您要执行的一个或多个命令。

完成输入命令后,请按Ctrl-D退出at会话并保存作业。该命令将显示作业编号以及执行时间和日期。

at 09:00 #在09:00运行定时作业/任务

warning: commands will be executed using /bin/sh
at> tar -xf /home/myfreax/file.tar.gz
at> <EOT>
job 4 at Tue May  5 09:00:00 2020

echo "command_to_be_run" | at 09:00使用echo通过管道传递at命令的示例,另一个选择是使用heredoc文档

at 09:00 <<END
command_to_be_run
END

使用at命令读取标准输入通常是在脚本中使用,我们很多时候都是使用文件作为at的参数。可重复使用。

例如,你要创建脚本/home/myfreax/script.sh的作业/定时任务。你可使用命令at 09:00 -f /home/myfreax/script.sh09:00小时运行脚本

默认情况下,如果命令产生输出,则at将在作业/定时任务完成后向用户发送一封包含输出的电子邮件。

即使没有输出,也可以使用-m发送电子邮件。使用-M选项调用at以禁止显示电子邮件通知。

at 09:00 -f /home/myfreax/script.sh

时间格式

at程序接受各种时间格式。您可以指定时间,日期和从当前时间开始的时间增量。

Time指定时间,请使用HH:MMHHMM格式。若要指示12小时制,请在时间后使用ampm

您还可以使用nowmidnightnoonteatime之类的字符串。如果过了指定的时间,则作业/定时任务将在第二天执行。

Date at命令允许您将作业安排在指定的日期。可以使用月份名称,日期和可选的年份来指定日期。

您可以使用字符串,例如todaytomorrow或weekday。日期也可以使用MMDD[CC]YYMM/DD/[CC]YYDD.MM.[CC]YY[CC]YY-MM-DD格式表示。

Increment是时间增量,at也接受以now + count time-unit格式递增时间,其中count是数字。time-unit可以是minuteshoursdaysweeks字符串之一。

时间,日期和增量可以组合,以下是一些示例。

安排下一个星期日的作业/定时任务,时间比当前时间晚十分钟:

at sunday +10 minutes

两天之后的下午1点运行作业:

at 1pm + 2 days

安排在2022年10月21日12:30运行的作业:

at 12:30 102122

在一小时之后:

at now +1 hours

您也可以使用-t选项指定时间和日期以[[CC]YY]MMDDhhmm[.ss]格式。

at -t 202005111321.32

batch命令

batch或者batch的别名at -b,可在指定的系统负载允许时,调度作业并批量处理队列中任务与作业。

默认情况下,作业或者定时任务在系统平均负载低于1.5时执行。可以在启动atd服务时指定负载的值。如果系统平均负载高于指定的平均负载,则作业将在队列中等待。

由于batchat -b的别名,因此,你也可以像使用at一样使用batch。包括从文件中读取命令等。

echo "command_to_be_run" | batch这是一个简单的示例,使用batch创建作业/定时任务。

指定队列

默认情况下,使用at创建的作业安排在名为a的队列中,使用batch创建的作业安排在b队列中。

查询的名称可以从az,从AZ。在英语中,a比b更低,26个字母中z是最高的。较低字母的队列优先级较低,字母较高的队列优先级更高。

at命令的-q选项允许你在创建作业时指定队列。例如,要在L队列中创建作业,你可运行命令at monday +2 hours -q L

你可使用atq命令或者是at -l列出/查看队列中待处理的任务于作业。当以root用户调用atq时,它将列出所有用户的待处理作业。

输出将列出所有作业。每行列出一个。包括作业编号,日期,时间,队列字母和用户名。

9	  Tue May  5 12:22:00 2020 a myfreax
12	Wed Oct 21 12:30:00 2020 a myfreax
15	Tue May  5 09:00:00 2020 a myfreax
6	  Tue May  5 09:00:00 2020 a myfreax
13	Mon May  4 23:08:00 2020 a myfreax
11	Wed Jul  1 10:00:00 2020 a myfreax
4	  Tue May  5 09:00:00 2020 a myfreax

要删除待处理的作业,请调用atrmat -r命令,后跟作业号。 例如,要删除编号为9的作业,应运行:

atrm 9

限制用户

/etc/at.deny/etc/at.allow文件使您可以控制哪些用户可以使用atbatch命令创建作业。 这些文件由用户名列表组成,每行一个用户名。

默认情况下,仅/etc/at.deny 文件存在,并且为空,这意味着所有用户都可以使用at命令。 如果您要拒绝对特定用户的许可,请将用户名添加到此文件中。

如果/etc/at.allow文件存在,则仅此文件中列出的用户可以使用at命令。如果两个文件都不存在,则只有具有管理特权的用户才能使用at命令。

结论

at命令从标准输入读取命令,并在以后执行它们。与crontab不同,使用at创建的作业仅执行一次。有关终端中at命令类型man at的所有可用选项的更多信息。

如果您有任何疑问,请随时发表评论。