Linux 下 At 命令

2020-05-11 14:13:55 浏览数 (1)

at是一个命令行工具,它允许你指定命令在指定的时间运行。由at创建的任务,仅仅会被执行一次。

在本文中,我们将会讲解如何使用at以及它的同类工具batch,atq,atrm去查看,删除和创建任务,以便在稍后的时间运行。

一、安装At

取决于不同的发行版,at在你的 Linux 系统中可能有,也可能没有。

如果at没有被安装,你可以很容易地使用你发行版的软件包来安装它。

1.1 在 Ubuntu 和 Debian 上安装at

代码语言:javascript复制
sudo apt update 
sudo apt install at

1.2 在 CentOS 和 Fedora 上安装at

代码语言:javascript复制
sudo yum install at

一旦程序被安装好,确认atd,这个守护程序正在运行,并且被设置成开机启动:

代码语言:javascript复制
sudo systemctl enable --now atd

二、如何使用at命令

at的简单语法如下:

代码语言:javascript复制
at [OPTION...] runtime

这个at命令将日期和时间(runtime)作为参数,用来决定你的任务什么时候执行,并且命令将会从标准输入上执行。

让我们创建一个任务,在上午9:00执行:

代码语言:javascript复制
at 09:00

一旦你输入Enter,你将会被展示at命令的提示界面,通常以at>开头。你也会看到一个警告,告诉你你将要运行命令的 shell 环境:

代码语言:javascript复制
warning: commands will be executed using /bin/sh
at>

输入一个或者更多你想要执行的命令:

代码语言:javascript复制
tar -xf /home/linuxize/file.tar.gz

当你完成输入命令的时候,按Ctrl-D退出提示界面,并且保存任务:

代码语言:javascript复制
at> <EOT>
job 4 at Tue May  5 09:00:00 2020

这个命令将会显示任务序号,和执行的时间和日期。

除了在at提示界面输入命令之外,还有一些方法可以传递你需要运行的命令。一种方法就是使用echo,然后使用管道传递给at

代码语言:javascript复制
echo "command_to_be_run" | at 09:00

另外一种选项就是使用这里的文档

代码语言:javascript复制
at 09:00 <<END
command_to_be_run
END

想要从文件中读取命令,而不是标准输入中读取,运行命令加上-f,再加上文件路径。例如,想要创建一个任务,运行脚本: /home/linuxize/script.sh:

代码语言:javascript复制
at 09:00 -f /home/linuxize/script.sh

默认情况下,这个命令会产生输出,一旦任务完成,at将会发送一封包括输出的邮件给用户。运行at加上-M选项将会阻止邮件通知。

代码语言:javascript复制
at 09:00 -M

使用-m选项时,即使没有输出,也会发送一封邮件。

代码语言:javascript复制
at 09:00 -m

三、batch命令

batch或者它的关联at -b预定任务并且在系统负载允许的情况下,批量执行任务。默认情况下,当系统平均负载在1.5以下的时候,任务将会被执行。在运行atd守护进程的时候,负载值可以被指定。如果系统负载平均值高于指定的值,任务将会在队列中等待。

想要使用batch创建一个任务,传递你想要执行的命令:

代码语言:javascript复制
echo "command_to_be_run" | batch

四、指定执行时间

at工具接受一个宽泛的指定。你可以指定时间,日期,和当前时间的增量。

  • Time - 指定一个时间HH:MM或者HHMM形式。想要使用12小时格式,使用am或者pm在时间后面。你可以使用字符串"now”,“midnight”,“noon” 或者 “teatime”(16:00)。如果传递了指定时间,那么任务将会在下一天执行。
  • Date - 这个命令允许你指定任务在指定日期执行。 这个日期可以使用月份,加上天数,也可以选择加上年份。你可以使用字符串,例如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。

Time, date 和 increment 可以合并使用,下面是一些例子:

  • 计划任务在即将到来的星期日,当前时间之后的十分钟执行:
代码语言:javascript复制
at sunday  10 minutes
  • 计划任务在两天后的1pm执行:
代码语言:javascript复制
at 1pm   2 days
  • 计划任务在 12:30 Oct 21 2020 运行:
代码语言:javascript复制
at 12:30 102120
  • 计划任务在从现在开始的一个小时后运行:
代码语言:javascript复制
at now  1 hours

你可以使用-t选项,以这个格式[[CC]YY]MMDDhhmm[.ss]指定一个时间和日期。

下面是一个例子:

代码语言:javascript复制
at -t 202005111321.32

五、指定队列

默认情况下,由at创建的任务被计划在命名为a的队列,并且由batch创建的任务被计划在b队列。

队列命名从az,和 从AZ。对于使用更小字母的队列,它们有更小的 niceness 值,这意味着它们拥有比那些更大字母更高的优先级。

你可以使用-q选项,指定一个队列。例如,想要设置一个任务到L队列,你将要运行:

代码语言:javascript复制
at monday  2 hours -q L

六、 列出将要执行的任务

想要列出用户将要执行的任务,运行atq或者at -l命令:

代码语言:javascript复制
atq

输出将会列出所有的任务,一行一个。每一行包括任务号码,日期,时间,队列字母,和用户名。

代码语言:javascript复制
9	  Tue May  5 12:22:00 2020 a linuxize
12	Wed Oct 21 12:30:00 2020 a linuxize
15	Tue May  5 09:00:00 2020 a linuxize
6	  Tue May  5 09:00:00 2020 a linuxize
13	Mon May  4 23:08:00 2020 a linuxize
11	Wed Jul  1 10:00:00 2020 a linuxize
4	  Tue May  5 09:00:00 2020 a linuxize

使用管理员账户运行atq的时候,它将会列出所有用户将要执行的任务。

七、移除将要执行的任务

想要移除将要执行的任务,运行atrm或者at -r命令加上任务号。例如,想要移除任务,序号为9,你将运行:

代码语言:javascript复制
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


0 人点赞