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
,这个守护程序正在运行,并且被设置成开机启动:
sudo systemctl enable --now atd
二、如何使用at
命令
at
的简单语法如下:
at [OPTION...] runtime
这个at
命令将日期和时间(runtime)作为参数,用来决定你的任务什么时候执行,并且命令将会从标准输入上执行。
让我们创建一个任务,在上午9:00执行:
代码语言:javascript复制at 09:00
一旦你输入Enter
,你将会被展示at
命令的提示界面,通常以at>
开头。你也会看到一个警告,告诉你你将要运行命令的 shell 环境:
warning: commands will be executed using /bin/sh
at>
输入一个或者更多你想要执行的命令:
代码语言:javascript复制tar -xf /home/linuxize/file.tar.gz
当你完成输入命令的时候,按Ctrl-D
退出提示界面,并且保存任务:
at> <EOT>
job 4 at Tue May 5 09:00:00 2020
这个命令将会显示任务序号,和执行的时间和日期。
除了在at
提示界面输入命令之外,还有一些方法可以传递你需要运行的命令。一种方法就是使用echo
,然后使用管道传递给at
:
echo "command_to_be_run" | at 09:00
另外一种选项就是使用这里的文档
代码语言:javascript复制at 09:00 <<END
command_to_be_run
END
想要从文件中读取命令,而不是标准输入中读取,运行命令加上-f
,再加上文件路径。例如,想要创建一个任务,运行脚本: /home/linuxize/script.sh
:
at 09:00 -f /home/linuxize/script.sh
默认情况下,这个命令会产生输出,一旦任务完成,at
将会发送一封包括输出的邮件给用户。运行at
加上-M
选项将会阻止邮件通知。
at 09:00 -M
使用-m
选项时,即使没有输出,也会发送一封邮件。
at 09:00 -m
三、batch
命令
batch
或者它的关联at -b
预定任务并且在系统负载允许的情况下,批量执行任务。默认情况下,当系统平均负载在1.5以下的时候,任务将会被执行。在运行atd
守护进程的时候,负载值可以被指定。如果系统负载平均值高于指定的值,任务将会在队列中等待。
想要使用batch
创建一个任务,传递你想要执行的命令:
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 可以合并使用,下面是一些例子:
- 计划任务在即将到来的星期日,当前时间之后的十分钟执行:
at sunday 10 minutes
- 计划任务在两天后的1pm执行:
at 1pm 2 days
- 计划任务在 12:30 Oct 21 2020 运行:
at 12:30 102120
- 计划任务在从现在开始的一个小时后运行:
at now 1 hours
你可以使用-t
选项,以这个格式[[CC]YY]MMDDhhmm[.ss]
指定一个时间和日期。
下面是一个例子:
代码语言:javascript复制at -t 202005111321.32
五、指定队列
默认情况下,由at
创建的任务被计划在命名为a
的队列,并且由batch
创建的任务被计划在b
队列。
队列命名从a
到z
,和 从A
到Z
。对于使用更小字母的队列,它们有更小的 niceness 值,这意味着它们拥有比那些更大字母更高的优先级。
你可以使用-q
选项,指定一个队列。例如,想要设置一个任务到L
队列,你将要运行:
at monday 2 hours -q L
六、 列出将要执行的任务
想要列出用户将要执行的任务,运行atq
或者at -l
命令:
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,你将运行:
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
。