如何在Linux上批量使用和调度命令
如果我们要安排仅执行一次的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
启动sh
shell的一个实例,并其中运行命令。命令不会在与sh
shell程序兼容但具有更丰富功能集的Bash Shell中执行。
如果命令或者脚本尝试使用Bash提供的功能或者设施,但sh
不提供,则它们将失败。
测试命令或者脚本是否将在sh
中运行很容易。使用sh
命令启动sh
shell:
sh
命令提示符更改为美元符号($
),现在我们可以运行命令并验证其是否正常运行。
要返回Bash shell,请输入exit
命令:
exit
我们不会从命令中看到任何标准输出或者错误消息。这是因为sh
shell作为后台任务启动,并且在没有任何屏幕界面的情况下运行。
命令好或者坏的所有输出都会通过电子邮件发送给我们。它通过内部邮件系统发送给运行at命令的人。这意味着我们必须设置和配置该内部电子邮件系统。
许多(大多数)Linux系统没有内部电子邮件系统,因为几乎不需要一个。那些通常使用诸如sendmail或者postfix之类的系统的系统。如果系统没有内部电子邮件系统,则可以使脚本写入文件或者将输出重定向到文件以添加日志。
如果该命令未生成任何标准输出或者错误消息,则无论如何我们都不会收到电子邮件。许多Linux命令通过静默指示成功,因此在大多数情况下,我们不会收到电子邮件。
现在是时候在at键入命令了。在此示例中,我们将使用名为" sweep.sh"的小脚本文件,该文件将删除* .bak,。tmp和.o文件。键入命令的路径,如下所示,然后按Enter。
出现另一个命令提示符,我们可以根据需要添加任意数量的命令。通常,将命令包含在单个脚本中,而只是从at内调用该脚本会更方便。
按Ctrl + D告诉at你已经完成添加命令。at显示<EOT>,表示传输结束。系统将告知我们作业编号以及该作业的预定运行时间,如下所示:
作业执行后,键入以下内容检查内部邮件:
如果没有邮件,则必须承担成功。当然,在这种情况下,我们可以检查并查看* .bak,。tmp和.o文件是否已删除,以确认命令是否有效。
键入以下内容以再次运行整个过程:
at now + 1 minute
一分钟后,键入以下内容以重新检查邮件:
嘿,我们收到邮件了!要阅读第一条消息,请按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
以下是我们获得的有关该工作的信息的细分:
第一行:告诉我们命令将在
sh
shell下运行。第二行:我们看到命令将同时以用户ID和组ID 1000运行。这是运行at命令的人员的值。
第三行:发送邮件的人发送。
第四行:用户掩码为22. 这是用于为在此
sh
会话中创建的任何文件设置默认权限的掩码。从666中减去掩码,得到644(相当于" rw-r--r--"的八进制数)。剩余数据:大多数是环境变量。
测试结果:测试检查以确保可以访问执行目录。如果不能,将引发错误,并放弃作业执行。
将列出要执行的命令,并显示已调度脚本的内容。请注意,尽管上面示例中的脚本被编写为在Bash下运行,但仍将在
sh
shell中执行。
批处理命令
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
文件。我们将添加dave
和mary
,但是其他任何人都不能使用at
。
首先,我们键入以下内容:
sudo gedit /etc/at.allow
在编辑器中,我们添加两个名称,如下所示,然后保存文件。
如果其他人尝试使用at
,则会被告知他没有权限。例如,假设一个名为" eric"的用户键入以下内容:
at
如下所示,他将被拒绝。
同样," eric"不在" at.deny"文件中。一旦我们将任何人放在at.allow
文件中,任何人都会被拒绝使用at
的权限。