使用 at 进行一次性调度

LinuxBeginner
立即练习

简介

cron 适合执行重复性任务,例如每天或每小时运行一次。但有时你只需要在未来的特定时间执行某项任务一次。例如,你可能想在今晚凌晨 2:00 重启服务,或者在 30 分钟后创建数据库快照。

对于这类一次性任务,Linux 提供了 at 工具。

at 命令会从标准输入或文件中读取命令,并在稍后的时间执行这些命令。当任务需要延迟执行但不需要重复运行时,at 非常有用。这与 cron 的重复调度模式不同。

两者的核心区别很简单:cron 描述重复执行的计划,而 at 将一次性的未来任务加入队列。它们都是自动化工具,但解决的是不同的时间调度问题。

在本实验中,你将完成以下操作:

  1. 安装前置组件:确保已安装 at 工具,并且其守护进程正在运行。
  2. 调度任务:使用 at 将命令加入未来执行队列。
  3. 查看队列:使用 atq 列出待处理任务。
  4. 管理任务:使用 atrm 从队列中移除任务。

安装 at 工具

并非所有 Linux 发行版都会默认安装 at 命令。首先确认该工具已经安装,并且其后台服务正在运行。

与 cron 一样,at 依赖一个守护进程。你输入的命令会创建一个排队等待执行的任务定义,后台服务则负责在稍后实际运行该任务。

  1. 安装软件包:
sudo apt-get install -y at
  1. at 系统依赖名为 atd 的后台守护进程来执行已调度的命令。启动该服务:
sudo service atd start
  1. 确认服务处于活动状态:
sudo service atd status

你应该能看到表明 atd 正在运行的输出。

调度任务

系统准备就绪后,通过调度一个简单任务来验证 at 是否正常工作。这个任务会在 5 分钟后创建一个文件。

首先,运行 at 命令并在后面指定目标时间:

at now + 5 minutes

命令行提示符会变为 at>,表示程序正在等待你输入内容。输入要执行的命令:

这个交互界面与 cron 不同,因为 at 会交互式地收集未来任务的命令文本。你实际上是在编写一次性任务的内容,并将其提交到队列中。

echo "Hello LabEx" > /home/labex/project/hello.txt

保存并退出:

  • 按 Ctrl + D。

你应该会看到 <EOT>(传输结束)以及类似 job 1 at ... 的确认消息。

这表示任务已经提交到队列。

列出待处理任务(atq)

调度任务后,你可能需要确认任务是否已进入队列,或者查看任务 ID。

使用 atq 命令列出队列:

atq

输出通常类似于:1 Mon Oct 23 10:05:00 2023 a labex

字段说明:

  • 1:任务 ID。移除任务时需要使用这个编号。
  • 日期/时间:任务计划执行的时间。
  • 用户:拥有该任务的用户。

查看队列很重要,因为任务提交后很容易被忘记。atq 可以帮助你在任务执行前检查待处理任务。

如果队列为空,可能是任务已经执行,或者提交失败。

取消任务(atrm)

如果你改变了计划,或者发现任务配置有误,可以在任务执行前将其从队列中移除。

使用 atrm 命令,并在后面指定任务 ID。

首先使用 atq 确认任务 ID(在上一步中,它很可能是 1)。然后运行:

atrm 1

现在确认队列为空:

atq

输出应该为空,这表示任务已取消。不会创建任何文件。

这个取消步骤说明,排队等待执行的任务是可以管理的对象,而不是提交后就无法控制的命令。你可以在任务执行前查看任务、通过 ID 识别任务,并在计划改变时将其移除。

总结

在本实验中,你学习了如何管理一次性任务:

  1. 安装:配置 at 和 atd。
  2. 调度(at):使用 at now + 5 minutes 这样的语法,将未来要执行的命令加入队列。
  3. 列出任务(atq):查看队列中的待处理任务 ID 和执行时间。
  4. 移除任务(atrm):使用任务 ID 从队列中删除指定任务。

需要重复调度时使用 cron,需要单次延迟执行时使用 at。