使用 at 命令在 Linux 中安排任务
Linux 中的 at 命令可用于安排不按固定时间表运行的作业。
它可以与Linux 中的 Crontab概念进行比较,后者是自动执行重复任务的更好方法。
在本教程中,我将展示如何使用“at 命令”来安排在未来的某个时间运行的任务和命令。
在 Linux 中通过命令安装
在开始之前,您应该检查系统上是否安装了“at”。它并非在所有操作系统上都默认安装。
您可以输入以下命令进行检查:
at -V
如果软件已安装,这将返回版本号。如果没有,可以在基于 Debian 的系统上输入以下命令进行安装:
sudo apt install at
如果您使用的是不同的 Linux 发行版,则可能需要修改此命令以反映您的发行版所使用的包管理器。
入门
“at 实用程序”实际上是一系列协同工作以安排作业的命令。正如我已经提到的,如果您的任务更像是“一次性”而不是重复发生的事件,则at是首选。
我制作了一个表格,其中包含与at相关的一些基本命令。
命令 | 功能 |
---|---|
在 | 允许用户安排任务 |
陣容 | 列出已登录用户的排队作业,如果以 sudo 运行,则列出所有用户 |
自动取款机 | 按指定作业编号删除作业 |
批 | 指示系统仅在系统负载处于特定水平(平均负载<1.5)时在指定时间运行作业 |
所有按键绑定 | [ Ctrl + A ] + ? |
在Linux中使用at命令进行作业调度
使用at有其独特的格式。当你想安排一项工作时,你将在终端中输入:
at [time] [date/day]
时间是必填项,但日期是可选的,如果没有输入,它将根据当前日期和系统时间进行假设。
按下回车键后,系统会提示您输入命令。您可以输入任意数量的命令。输入“ctrl + d”保存并退出。
让我通过例子向你展示一下。
示例 1:使用自然语言输入时间/日期
您可以使用多种不同的方式输入时间。与 crontab 的基于星号的系统有些复杂不同,“at”可以更有效地识别“人工”输入。
软件可以理解许多类似人类的表达方式。其中很多都是特定于地区的。它可以识别“午夜”或“中午”等常见表达方式。它还可以区分上午和下午。同样,它可以识别不同格式的日期和星期几,包括缩写。
它还可以使用“now”这个表达。您只需输入下面的命令,它将在 5 分钟内运行该命令。
at now + 1 minutes
christopher@linux:~$ at now + 1 min
warning: commands will be executed using /bin/sh
at> echo "Look at you, using at like a champ!" > message.txt
at> <EOT>
job 8 at Mon Jan 6 02:59:00 2020
您很可能忽略有关bin/sh的警告。如果您使用其他 shell,则可能会引起麻烦。绝大多数 Linux 发行版都以bash作为系统 shell,符号链接为“sh”……说来话长。
那么,大约过了一分钟,对吧?检查目录中是否有新文件。
您应该有一个名为“message.txt”的文件,其中包含我们的文本。
christopher@linux:~$ ls m*
message.txt
看起来不错,但是它能正确捕获我们的消息吗?让我们查看文件的内容:
christopher@linux:~$ cat message.txt
Look at you, using at like a champ!
示例 2:使用指定的时间/日期
对于您的第一份工作,您使用了“相对”时间“现在 + [时间]”。这是一种安排工作非常简单的方法,但您可能希望更具体一些。
这次,让我们在不同时间安排两项工作。
您可以使用上例中创建的 message.txt 文件进行演示。每个作业都会替换文件的内容。
您可以使用 date 命令检查 Linux 系统上的当前时间。
为特定时间设置第一份工作(从现在起 5 分钟):
christopher@linux:~$ at 3:45
warning: commands will be executed using /bin/sh
at> echo "5 minutes later..." > message.txt
at> <EOT>
job 11 at Mon Jan 6 03:45:00 2020
为特定时间(从现在起 10 分钟)设置第二项工作:
christopher@linux:~$ at 3:50
warning: commands will be executed using /bin/sh
at> echo "10 minutes later..." > message.txt
at> <EOT>
job 12 at Mon Jan 6 03:50:00 2020
在3:45处验证:
christopher@linux:~$ cat message.txt
5 minutes later...
在3:50处验证:
christopher@linux:~$ cat message.txt
10 minutes later...
示例 3:使用 atq 查看所有排队作业
您可以随时使用 atq 命令检查计划的作业。它将列出登录用户当前计划的所有作业。要查看系统上的所有作业,您可能需要使用提升的权限。
christopher@linux:~$ atq
11 Mon Jan 6 03:45:00 2020 a christopher
12 Mon Jan 6 03:50:00 2020 a christopher
每个作业都通过作业 ID、计划时间和相关用户来标识。
您还可以使用 -c 选项查看计划作业的内容:
at -c jobnumber
示例 4:使用 atrm 删除计划作业
如果您决定在执行作业之前取消它,可以通过键入命令后跟其相应的作业 ID(您可以使用 atq 命令获取)来完成。
christopher@linux:~$ atrm 11
christopher@linux:~$ atq
12 Mon Jan 6 03:50:00 2020 a christopher
如您所见,作业 11 已从队列中删除。
示例 5:使用文件执行 at 命令
也许您有一组想要不定期运行的脚本,而 cron 并不合适。您可以输入多个作业,而无需使用标准输入。
让我们想象一下这样的场景:人力资源部要求提供他们认为违反工作政策的员工的计算机活动记录。您可能希望某些活动日志或其他历史信息在特定时间为您生成报告。
您可以通过在文本文件中列出必要的脚本并使用 at 执行它们来节省时间。
christopher@linux:~$ cat problem_employee_logs.txt
path/to/get_browsing_history.sh
/whatever/path/get_activity_logs.sh
你明白了。现在,你可以将 -f 添加到 'at' 命令,并在后面包含文件名,如下所示:
christopher@linux:~$ at now + 2 minutes -f problem_employee_logs.txt
warning: commands will be executed using /bin/sh
job 16 at Mon Jan 6 05:42:00 2020
示例 6:当 CPU 负载低于阈值时运行作业
默认情况下,当 CPU 平均负载降至 1.5 以下时,将运行批处理作业。
batch
输入批处理作业的方法与“ at ”相同,只是不需要指定时间。
如果您想更改负载阈值,可以使用以下命令:
atd -l [n]
其中 n 是您想要选择的负载阈值。手册页建议您将其更改为大于 n-1,其中 n 是系统中的 CPU 数量。
结论
感谢阅读。希望您对 at 命令的理解有所提高。如果您有任何疑问或想分享如何使用此命令,请告诉我们!请在下方留言。