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