安装完成后,您可以使用以下命令启动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将响应“乱码时间”,如下所示:
at
at 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一起使用,如下所示:
atq
atrm 11
atq
如何查看作业的详细视图
正如我们前面提到的,您可以将作业安排到很久以后。有时候,你可能会忘记一份工作要做什么。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进行计划。 如果要仅在系统负载足够低时运行任务,请使用批处理。