如何在Linux上使用at和Batch来调度命令

如果您想调度一个只会发生一次的Linux作业,那么cron就大材小用了。at系列命令就是您所需要的!如果只想在系统有空闲资源时运行进程,可以使用批处理。

如何调度Linux作业

cron守护进程维护它在特定时间运行的作业列表。这些任务和程序在预定时间在后台运行。这为您安排需要重复的任务提供了极大的灵活性。无论您需要每小时、每天的特定时间运行一次任务,还是每月或每年运行一次,您都可以在cron中设置它。

但是,如果您希望将任务安排为只运行一次,则这不会有任何帮助。当然,您不能在cron中设置它,但是在任务执行之后,您必须记得返回并删除crontab条目,这是不方便的。

对于Linux,如果您正在为某个问题而苦苦挣扎,那么几乎可以保证其他人也在为此而苦苦挣扎。幸运的是,因为类似Unix的操作系统已经存在了这么久,所以也很有可能有人已经为您的问题创建了解决方案。

对于上面概述的问题,他们已经做到了,这就是所谓的。

相关:如何在Linux上调度任务:Crontab文件简介

安装at命令

我们必须在Ubuntu18.04和Manjaro 18.1.0上安装(它已经安装在Fedora31上)。

要在Ubuntu上安装,请使用以下命令:

sudo apt-get install at

安装完成后,您可以使用以下命令启动at守护进程:

sudo systemctl enable --now atd.service

在Manjaro上,使用以下命令安装:

sudo pacman -Sy at

安装完成后,键入以下命令以启动at守护程序:

sudo systemctl enable --now atd.service

在任何发行版上,您都可以键入此命令以确保ATD守护程序正在运行:

ps -e | grep atd

如何交互使用at命令

要在中使用,您必须为其指定运行日期和时间。编写这些代码的方式有很大的灵活性,我们将在本文后面介绍这一点。

但是,即使我们要以交互方式使用,您也必须预先提供日期和时间。如果您在命令行中未包含任何内容,或者您键入的内容不是日期和时间,则At将响应“乱码时间”,如下所示:

atat banana

日期和时间可以是显式的,也可以是相对的。例如,假设您想在一分钟后执行一个命令。AT知道“Now”是什么意思,所以您可以使用Now,然后再增加一分钟,如下所示:

at now + 1 minute

at打印出一条消息和at提示符,并等待您键入要计划的命令。不过,首先考虑一下下面的消息,如下所示:

它告诉您,至少会启动sh shell的一个实例,并不会运行其中的命令。您的命令将不会在Bash shell中执行,它与sh shell兼容,但具有更丰富的功能集。

如果您的命令或脚本试图使用Bash提供的函数或工具,但sh没有,那么它们将失败。

测试您的命令或脚本是否可以在sh中运行很容易。使用sh命令启动sh shell:

sh

命令提示符更改为美元符号($),您现在可以运行命令并验证它们是否正确运行。

要返回到Bash shell,请键入exit命令:

exit

您将不会看到来自命令的任何标准输出或错误消息。这是因为sh shell作为后台任务启动,并且在没有任何屏幕界面的情况下运行。

命令的任何输出-好的或坏的-都会通过电子邮件发送给您。它通过内部邮件系统发送给任何运行at命令的人。这意味着您必须设置和配置该内部电子邮件系统。

许多(大多数)Linux系统没有内部电子邮件系统,因为很少需要内部电子邮件系统。那些通常使用像Sendmail或Postfix这样的系统。*如果您的系统没有内部电子邮件系统,您可以让脚本写入文件或将输出重定向到文件以添加日志记录。

如果该命令不生成任何标准输出或错误消息,您无论如何都不会收到电子邮件。许多Linux命令通过静默表示成功,因此在大多数情况下,您不会收到电子邮件。

相关:Linux上的stdin、stdout和stderr是什么?

现在,是输入命令的时候了。对于本例,我们将使用一个名为Sweep.sh的小脚本文件来删除*.bak、*.tmp和*.o文件。键入命令的路径,如下所示,然后按Enter键。

此时将出现另一个命令提示符,您可以根据需要添加任意数量的命令。通常,将命令放在单个脚本中并只需从at内调用该脚本会更方便。

按Ctrl+D可在此时通知您已完成添加命令。DATAT显示<EOT>,表示传输结束。系统会告诉您作业编号和作业计划运行的时间,如下所示:

作业执行后,键入以下内容以检查您的内部邮件:

mail

如果没有邮件,你就得假设成功了。当然,在这种情况下,您可以检查并查看是否删除了*.bak、*.tmp和*.o文件,以确认命令有效。

键入以下命令以再次运行整个程序:

at now + 1 minute

一分钟后,键入以下内容以重新检查您的邮件:

mail

嘿,我们有邮件了!要阅读第一条留言,请按1,然后按Enter。

我们收到了一封来自at的电子邮件,因为脚本中的命令生成了错误消息。在本例中,没有要删除的文件,因为当我们之前运行脚本时,它会删除这些文件。

按D+Enter删除电子邮件,按Q+Enter退出邮件程序。

日期和时间格式

当谈到可以与at一起使用的时间格式时,您有很大的灵活性。以下是一些例子:

上午11:00播出: 上午11:00。 上午11点开播。明天: 明天上午11点。 上午11点开播。下周的今天: 下周上午11点。 在这个时间,在这一天,在下周: 在下周。 上午11点开播。下周五: 下个星期五上午11:00。 下周五这个时候放映: 在下一个星期五。 上午11点开播。在这一天,也就是下个月: 下个月上午11点。 上午11点开播。在特定日期: 2020年3月15日上午11:00。 从现在开始运行30分钟: 现在+30分钟。 从现在开始跑两个小时: 现在+2小时。 明天这个时候跑步: 在明天。 周四此时运行: 在星期四。 上午12:00开播: 在午夜。 下午12:00播出: 中午。 如果您是英国人,您甚至可以安排一个命令在下午4点茶点运行: 在吃茶点的时候

查看作业队列

您可以键入atQ命令查看计划的作业队列,如下所示。

对于队列中的每个命令,atQ会显示以下信息:

作业ID。 预定日期。 预定时间。 作业所在的队列。队列被标记为“a”、“b”,依此类推。使用at调度的普通任务进入队列“a”,而使用Batch Server(本文稍后介绍)调度的任务进入队列“b”。 安排作业的人员。

在命令行上使用at

您不必以交互方式使用at;您也可以在命令上使用它。这使得更容易在内部脚本中使用。

您可以将命令通过管道传送到at,如下所示:

echo "sh ~/sweep.sh" | at 08:45 AM

作业由at接受和调度,作业编号和执行日期与以前一样报告。

相关:如何在Linux上使用管道

将at与命令文件一起使用

您还可以将一系列命令存储在文件中,然后将其传递给。这可以是命令的纯文本文件-它不必是可执行脚本。

您可以通过以下方式使用-f(文件)选项将文件名传递给:

at now + 5 minutes -f clean.txt

如果将文件重定向到以下位置,也可以获得相同的结果:

at now + 5 minutes < clean.txt

从队列中删除计划的作业

要从队列中删除排定作业,可以使用atrm命令。如果您想要首先查看队列以找到要删除的作业编号,可以使用atq命令。然后,将该作业号与atrm一起使用,如下所示:

atqatrm 11atq

如何查看作业的详细视图

正如我们前面提到的,您可以将作业安排到很久以后。有时候,你可能会忘记一份工作要做什么。atq命令显示队列中的作业,但不显示它们要执行的操作。如果希望查看作业的详细视图,可以使用-c(Cat)选项。

首先,我们将使用atQ查找作业号:

atq

现在,我们将使用带有-c选项的作业号13:

at -c 13

以下是我们得到的关于这份工作的信息的细目:

第一行:这告诉我们命令将在sh shell下运行。 第二行:我们看到命令将以1000的用户和组ID运行。这些是运行at命令的用户的值。 第三行:是收到或发送任何电子邮件的人。 第四行:用户掩码为22。这是用于设置在此sh会话中创建的任何文件的默认权限的掩码。掩码从666中减去,得到644(rw-r--r--的八进制等价物)。 剩余数据:大多数是环境变量。

测试结果。测试检查以确保可以访问执行目录。如果不能,则会引发错误,并放弃作业执行。 列出要执行的命令,并显示计划的脚本内容。请注意,尽管上面示例中的脚本是在Bash下运行的,但它仍将在sh shell中执行。

批处理命令

BATCH命令的操作类似于at命令,但有三个显著区别:

您只能以交互方式使用批处理命令。 不是调度作业在特定时间执行,而是将它们添加到队列中,当系统的平均负载低于1.5时,批处理命令就会执行它们。 由于上述原因,您永远不要使用批处理命令指定日期和时间。

使用批处理命令时,您可以按名称调用它,而不使用命令行参数,如下所示:

batch

接下来,添加任务,就像使用at命令一样。

控制对at命令的访问

at.Allow和at.Deny文件控制谁可以使用at系列命令。它们位于/etc目录中。默认情况下,只存在at.Deny文件,它是在安装at时创建的。

以下是这些功能的工作原理:

at.Deny:列出不能使用at调度作业的应用程序和实体。 at.Allow:列出可以使用at调度作业的人员。如果at.allow文件不存在,则AT仅使用at.Deny文件。

默认情况下,任何人都可以在使用。如果要限制谁可以使用它,请使用at.allow文件列出可以使用它的人。这比将不能使用at的所有人添加到at.Deny文件中要容易。

下面是at.Deny文件的外观:

sudo less /etc/at.deny

该文件列出了不能在上使用的操作系统组件。出于安全原因,许多文件不能这样做,所以您不想从文件中删除任何文件。

现在,我们将编辑at.allow文件。我们将增加戴夫和玛丽,但不允许其他人使用。

首先,我们键入以下内容:

sudo gedit /etc/at.allow

在编辑器中,我们添加这两个名称,如下所示,然后保存文件。

如果其他任何人试图使用at,他将被告知他没有获得许可。例如,假设名为Eric的用户键入以下内容:

at

他将被拒绝,如下所示。

同样,Eric不在at.Deny文件中。一旦您将任何人放入at.allow文件中,任何人-以及其他所有人都被拒绝在中使用。

非常适合一次性使用

如您所见,对于只需要运行一次的任务来说,atat和批处理都是理想的选择。再次快速回顾一下:

当您需要做一些不是常规流程的事情时,可以使用at进行计划。 如果要仅在系统负载足够低时运行任务,请使用批处理。

相关文章