如何在Linux上批量使用和调度命令

时间:2020-01-09 10:39:50  来源:igfitidea点击:

如果我们要安排仅执行一次的Linux作业,那么cron会显得过分杀伤。我们需要的是at系列命令!而且,如果我们只想在系统有可用资源时运行进程,则可以使用batch

如何安排Linux作业

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

但是,如果我们只想安排一个任务运行一次,这将无济于事。当然,我们可以在cron中进行设置,但是随后我们必须记住在任务执行后返回并删除crontab条目,这很不方便。

使用Linux时,如果我们遇到问题,也几乎可以确保其他人也对此感到困难。幸运的是,由于类似Unix的操作系统已经存在了很长时间,因此也很有可能有人为问题创建了解决方案。

对于上面概述的问题,他们有,并且称为" at"。

安装at命令

我们必须在Ubuntu 18.04和Manjaro 18.1.0上安装" at"(已经在Fedora 31上安装了)。

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

sudo apt-get install at

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

sudo systemctl enable --now atd.service

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

sudo pacman -Sy at

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

sudo systemctl enable --now atd.service

在任何发行版上,我们可以键入以下命令以确保atd守护程序正在运行:

ps -e | grep atd

如何交互使用at命令

要使用at,我们必须为其指定运行日期和时间。我们可以很灵活地编写这些内容,我们将在本文后面介绍。

但是,即使我们要交互使用at,我们也必须提前提供日期和时间。如果我们在命令行中未包含任何内容,或者我们键入的不是日期和时间,则at会显示乱码,如下所示:

at
at banana

日期和时间可以是明确的也可以是相对的。例如,假设我们希望从现在开始一分钟执行一条命令。 at知道现在意味着什么,因此我们可以使用now并向其中添加一分钟,如下所示:

at now + 1 minute

at会输出一条消息和at提示,并等待我们键入要计划的命令。但是,首先考虑该消息,如下所示:

它告诉我们在at启动shshell的一个实例,并其中运行命令。命令不会在与shshell程序兼容但具有更丰富功能集的Bash Shell中执行。

如果命令或者脚本尝试使用Bash提供的功能或者设施,但sh不提供,则它们将失败。

测试命令或者脚本是否将在sh中运行很容易。使用sh命令启动shshell:

sh

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

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

exit

我们不会从命令中看到任何标准输出或者错误消息。这是因为shshell作为后台任务启动,并且在没有任何屏幕界面的情况下运行。

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

许多(大多数)Linux系统没有内部电子邮件系统,因为几乎不需要一个。那些通常使用诸如sendmail或者postfix之类的系统的系统。如果系统没有内部电子邮件系统,则可以使脚本写入文件或者将输出重定向到文件以添加日志。

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

现在是时候在at键入命令了。在此示例中,我们将使用名为" sweep.sh"的小脚本文件,该文件将删除* .bak,。tmp和.o文件。键入命令的路径,如下所示,然后按Enter。

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

按Ctrl + D告诉at你已经完成添加命令。at显示<EOT>,表示传输结束。系统将告知我们作业编号以及该作业的预定运行时间,如下所示:

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

mail

如果没有邮件,则必须承担成功。当然,在这种情况下,我们可以检查并查看* .bak,。tmp和.o文件是否已删除,以确认命令是否有效。

键入以下内容以再次运行整个过程:

at now + 1 minute

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

mail

嘿,我们收到邮件了!要阅读第一条消息,请按1,然后按Enter。

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

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

日期和时间格式

在可与at一起使用的时间格式方面,我们具有很大的灵活性。这里有一些例子:

  • 在上午11:00运行:
at 11:00 AM
  • 明天上午11:00运行:
at 11:00 AM tomorrow
  • 在下周的这一天上午11:00运行:
at 11:00 AM next week
  • 在下周的这一天,今天这一天运行:
at next week
  • 下周五上午11:00运行:
at 11:00 AM next fri
  • 在下周五的这个时间运行:
at next fri
  • 下个月的这个日期上午11:00运行:
at 11:00 AM next month
  • 在特定日期的上午11:00运行:
at 11:00 AM 3/15/2017
  • 从现在开始运行30分钟:
at now + 30 minutes
  • 从现在开始运行两个小时:
at now + 2 hours
  • 明天此时运行:
at tomorrow
  • 在星期四的这个时间运行:
at thursday
  • 凌晨12:00运行:
at midnight
  • 晚上12:00运行:
at noon
  • 如果我们是英国人,甚至可以安排在下午茶时间(下午4点)运行的命令:
at teatime

查看工作队列

我们可以输入" atq"命令来查看预定作业的队列,如下所示。

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

  • 工作编号

  • 约定的日期

  • 计划的时间

  • 将作业放入队列中。队列标记为a,b,依此类推。我们使用" at"安排的常规任务进入队列a,而我们使用" batch"安排的任务(本文稍后介绍)进入队列b。

  • 安排工作的人。

在命令行上使用at

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

我们可以将命令通过管道传递到" at",如下所示:

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

作业在" at"处接受并安排,作业号和执行日期的报告方式与以前一样。

与命令文件一起使用

我们也可以在文件中存储一系列命令,然后将其传递给at。这可以是命令的纯文本文件,而不必是可执行脚本。

我们可以通过以下方式使用-f(文件)选项,将文件名传递给at

at now + 5 minutes -f clean.txt

如果将文件重定向到" at",则可以实现相同的结果:

at now + 5 minutes < clean.txt

从队列中删除计划的作业

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

atq
atrm 11
atq

如何查看工作的详细视图

如前所述,我们可以安排将来的工作。有时,我们可能会忘记工作要做的事情。 atq命令向我们显示队列中的作业,但不显示它们将要执行的操作。如果要查看作业的详细视图,可以使用-c(cat)选项。

首先,我们将使用atq查找工作编号:

atq

现在,我们将作业编号13与-c方法一起使用:

at -c 13

以下是我们获得的有关该工作的信息的细分:

  • 第一行:告诉我们命令将在shshell下运行。

  • 第二行:我们看到命令将同时以用户ID和组ID 1000运行。这是运行at命令的人员的值。

  • 第三行:发送邮件的人发送。

  • 第四行:用户掩码为22. 这是用于为在此sh会话中创建的任何文件设置默认权限的掩码。从666中减去掩码,得到644(相当于" rw-r--r--"的八进制数)。

  • 剩余数据:大多数是环境变量。

  • 测试结果:测试检查以确保可以访问执行目录。如果不能,将引发错误,并放弃作业执行。

  • 将列出要执行的命令,并显示已调度脚本的内容。请注意,尽管上面示例中的脚本被编写为在Bash下运行,但仍将在shshell中执行。

批处理命令

batch命令的操作与at命令的操作类似,但是有三个明显的区别:

  • 我们只能交互使用batch命令。

  • 我们不必将作业安排在特定时间执行,而是将其添加到队列中,并且当系统的平均负载低于1.5时," batch"命令将其执行。

  • 由于上述原因,我们永远不会使用batch命令指定日期和时间。

当使用batch命令时,我们可以按名称调用它,而没有命令行参数,如下所示:

batch

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

控制对at命令的访问

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

这些是这样工作的:

  • at.deny:列出不能使用at来计划作业的应用程序和实体。

  • at.allow:列出谁可以使用at来安排工作。如果不存在at.allow文件,则at仅使用at.deny文件。

默认情况下,任何人都可以使用at。如果我们想限制谁可以使用它,请使用at.allow文件列出可以使用的人。这比将每个不能使用at的人添加到at.deny文件中要容易得多。

这是at.deny文件的样子:

sudo less /etc/at.deny

该文件列出了不能使用at的操作系统组件。由于安全原因,许多此类文件都被禁止这样做,因此我们不想从文件中删除任何文件。

现在,我们将编辑at.allow文件。我们将添加davemary,但是其他任何人都不能使用at

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

sudo gedit /etc/at.allow

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

如果其他人尝试使用at,则会被告知他没有权限。例如,假设一个名为" eric"的用户键入以下内容:

at

如下所示,他将被拒绝。

同样," eric"不在" at.deny"文件中。一旦我们将任何人放在at.allow文件中,任何人都会被拒绝使用at的权限。