at是一个命令行程序,可让您安排在指定时间执行的命令。与crontab不同用at
创建的任务仅执行一次。
在本教程中,说明如何使用at及其配套程序batch
,atq
,atrm
查看,删除和创建作业/定时任务。
某些发行版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...] runtime
。runtime
是脚本要使用解释器,你可指定脚本的任何解释器。默认是/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.sh
在09:00
小时运行脚本
默认情况下,如果命令产生输出,则at
将在作业/定时任务完成后向用户发送一封包含输出的电子邮件。
即使没有输出,也可以使用-m
发送电子邮件。使用-M
选项调用at
以禁止显示电子邮件通知。
at 09:00 -f /home/myfreax/script.sh
时间格式
at
程序接受各种时间格式。您可以指定时间,日期和从当前时间开始的时间增量。
Time指定时间,请使用HH:MM
或HHMM
格式。若要指示12小时制,请在时间后使用am
或pm
。
您还可以使用now
,midnight
,noon
或teatime
之类的字符串。如果过了指定的时间,则作业/定时任务将在第二天执行。
Date at命令允许您将作业安排在指定的日期。可以使用月份名称,日期和可选的年份来指定日期。
您可以使用字符串,例如today
,tomorrow
或weekday。日期也可以使用MMDD[CC]YY
,MM/DD/[CC]YY
,DD.MM.[CC]YY
或[CC]YY-MM-DD
格式表示。
Increment是时间增量,at
也接受以now + count time-unit
格式递增时间,其中count
是数字。time-unit
可以是minutes
,hours
,days
或weeks
字符串之一。
时间,日期和增量可以组合,以下是一些示例。
安排下一个星期日的作业/定时任务,时间比当前时间晚十分钟:
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
服务时指定负载的值。如果系统平均负载高于指定的平均负载,则作业将在队列中等待。
由于batch
是at -b
的别名,因此,你也可以像使用at一样使用batch。包括从文件中读取命令等。
echo "command_to_be_run" | batch
这是一个简单的示例,使用batch创建作业/定时任务。
指定队列
默认情况下,使用at
创建的作业安排在名为a
的队列中,使用batch
创建的作业安排在b
队列中。
查询的名称可以从a
到z
,从A
到Z
。在英语中,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
要删除待处理的作业,请调用atrm
或at -r
命令,后跟作业号。 例如,要删除编号为9的作业,应运行:
atrm 9
限制用户
/etc/at.deny
和/etc/at.allow
文件使您可以控制哪些用户可以使用at
或batch
命令创建作业。 这些文件由用户名列表组成,每行一个用户名。
默认情况下,仅/etc/at.deny
文件存在,并且为空,这意味着所有用户都可以使用at
命令。 如果您要拒绝对特定用户的许可,请将用户名添加到此文件中。
如果/etc/at.allow
文件存在,则仅此文件中列出的用户可以使用at
命令。如果两个文件都不存在,则只有具有管理特权的用户才能使用at
命令。
结论
at
命令从标准输入读取命令,并在以后执行它们。与crontab不同,使用at
创建的作业仅执行一次。有关终端中at
命令类型man at
的所有可用选项的更多信息。
如果您有任何疑问,请随时发表评论。