如何使用 Linux at 命令安排任务
时间是宝贵的,无论是财务、技术还是其他日常活动,时间管理都是生活各个方面值得赞赏的美德。
为了管理时间,熟练的系统管理员必须知道何时以及如何控制任务,以便能够以编程方式在特定时间执行任务,无论是重复执行还是按一定次数执行。您可以在多种情况下应用此概念,从计划的备份任务到定期收集系统日志。
您可以通过多种方式完成任务调度。在本文中,我将重点介绍 Linux 操作系统上可用于帮助实现此目标的简单工具:命令at
。我的同事 Seth 之前写了一篇关于 的精彩文章at
,因此我建议您查看它,以及我关于 另一个 Linux 调度工具cron命令 的文章。
本文力求尽可能简洁、直接和实用,这意味着我无法探索该at
实用程序的所有可用选项。让我们开始吧!
安装“at”实用程序
根据您的 Linux 发行版,该at
实用程序可能默认安装,也可能不安装。如果未安装,您可以使用发行版的包管理器进行安装。对于基于 Red Hat Enterprise Linux (RHEL) 的发行版:
$ sudo dnf install at
该at
软件包安装了与主命令一起使用的其他二进制文件:
$ sudo dnf repoquery -l at | grep bin
[...]
/usr/bin/at
/usr/bin/atq
/usr/bin/atrm
/usr/bin/batch
/usr/sbin/atd
/usr/sbin/atrun
该软件包提供了atd
守护进程,您可以通过使用at
和atq
命令与其进行交互:
$ sudo systemctl status atd
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2022-11-09 17:47:48 -03; 14min ago
Main PID: 1378 (atd)
Tasks: 1 (limit: 23643)
Memory: 428.0K
CGroup: /system.slice/atd.service
└─1378 /usr/sbin/atd -f
nov 09 17:47:48 demo.example.local systemd[1]: Started Job spooling tools.
何时使用“at”实用程序
at
和batch
( )命令at -b
从标准输入或指定文件读取。该at
工具允许您指定命令将在特定时间运行。batch
当系统负载水平下降到特定点时,该命令将执行命令。这两个命令都使用用户的 shell。
如果您需要用于时间导向作业控制的实用程序,请安装此at
软件包。如果您有每天、每周等在同一时间重复的重复作业,请使用crontab
。
有关所有可能参数的更多详细信息以及如何使用的示例at
,请阅读手册页:
$ man at
使用“at”命令安排任务
我将向您展示如何at
工作。首先,我将确定时间框架:
$ date
fri nov 11 15:21:58 -03 2022
现在,有一些不同的方法可以与该at
实用程序交互。其中之一是使用其交互式命令提示符。通过键入at {runtime}
并按 Enter来执行此操作:
$ date
fri nov 11 15:26:21 -03 2022
$ at 15:27
warning: commands will be executed using /bin/sh
at> echo "It works!" > /tmp/test.txt
at> <EOT>
job 2 at Fri Nov 11 15:27:00 2022
在定义运行时并输入at
命令提示符后,我定义了一个命令,在 15:27(GMT-3 下午 3:27)运行。在本例中,该命令会创建一个文本文件。要退出命令提示符,请键入Ctrl+D。at
然后,该实用程序会根据运行时定义将命令排队,以便稍后执行。要查看当前用户的待处理作业的概览,请使用atq
或 at -l
命令:
$ atq
2 Fri Nov 11 15:27:00 2022 a localuser
从上面的输出中,您可以看到以下内容:
- 2是唯一的工作编号。
- 2022 年 11 月 11 日星期五 15:27:00是计划作业的执行日期和时间。
- a表示该作业按默认队列a进行调度。
- localuser是作业所有者(也是运行该作业的用户)。
等待 39 秒后,当作业从队列中出来并执行时,会发生以下情况:
$ date
fri nov 11 15:27:01 -03 2022
$ atq
$ cat /tmp/test.txt
It works!
当然,这不是运行计划作业的理想方式;另一种方法是将所需命令通过管道传输作为实用程序的输入。在我的文章“使用 shell 重定向和管道操作文件”at
中了解更多信息。下面是一个简单的示例:
$ rm /tmp/test.txt
$ echo "It works while pipelining!" > /tmp/test.txt | at 15:41
warning: commands will be executed using /bin/sh
job 3 at Fri Nov 11 15:41:00 2022
$ atq
3 Fri Nov 11 15:41:00 2022 a localuser
$ date
fri nov 11 15:40:40 -03 2022
$ atq
$ date
fri nov 11 15:41:01 -03 2022
$ cat /tmp/test.txt
It works while pipelining!
使用带有‘at’命令的标志
该实用程序最常用的形式at
是使用参数指定现有脚本-f
(或使用 shell 重定向,at {runtime} {script.sh}
以便 at
可以从文件而不是标准输入读取输入。检查一下:
$ rm /tmp/test.txt
$ cat << EOF > myscript.sh
> echo "It works while scripting!" > /tmp/test.txt
> EOF
$ ls
myscript.sh
$ sudo chmod +x myscript.sh
$ date
fri nov 11 15:50:58 -03 2022
$ at 15:52 -f ./myscript.sh
warning: commands will be executed using /bin/sh
job 4 at Fri Nov 11 15:52:00 2022
$ atq
4 Fri Nov 11 15:52:00 2022 a localuser
$ date
fri nov 11 15:52:00 -03 2022
$ atq
$ cat /tmp/test.txt
It works while scripting!
您可以通过不同的方式指定运行时,例如:
- 时间:
- 时:分
- 模糊数学
- 12 小时格式(上午或下午)
- 午夜
- 中午
- 下午茶时间
- 日期:
- MMDD[CC]YY
- 月/日/[CC]年
- 日.月.[CC]YY
- [CC]年-月-日
- 今天
- 明天
- 平日
- 增量
- 现在 + 计数时间单位,其中时间单位可以是分钟、小时、天或周
该-b
参数(或batch
命令)允许您在系统利用率较低(平均负载低于 0.8)时自动安排作业运行,如下所示:
$ top -bc | head -1
top - 16:10:04 up 58 min, 1 user, load average: 0,00, 0,00, 0,00
$ rm /tmp/test.txt
$ ./myscript.sh | batch
warning: commands will be executed using /bin/sh
job 5 at Fri Nov 11 16:10:00 2022
$ atq
$ top -bc | head -1
top - 16:11:00 up 59 min, 1 user, load average: 0,00, 0,00, 0,00
$ cat /tmp/test.txt
It works while scripting!
最后,要从队列中删除或取消待处理的作业,您可以运行at -r
或atrm
并指定作业编号:
$ rm /tmp/test.txt
$ date
fri nov 11 16:16:23 -03 2022
$ at 16:17 -f myscript.sh
warning: commands will be executed using /bin/sh
job 6 at Fri Nov 11 16:17:00 2022
$ atq
6 Fri Nov 11 16:17:00 2022 a localuser
$ atrm 6
$ atq
$ date
fri nov 11 16:16:59 -03 2022
$ cat /tmp/test.txt
cat: /tmp/test.txt: No such file or directory
发挥您的创造力,想象一下您可以利用此实用程序的情况。从本质上讲,它最适合一次性作业调度的情况。
包起来
了解如何在系统上安排任务和作业非常重要。一些系统任务已默认安排,您需要了解它们的工作原理。此外,您经常需要自动化和安排延迟和重复的作业,以便在需要时运行以实现可编程目标。该at
命令将帮助您做到这一点,它是您的工具包中必备的基本实用程序。
我希望本文和我关于该cron
实用程序的文章能够帮助您理解这个主题并增加您的一般系统管理知识。