简介
cron 适合执行重复性任务,例如每天或每小时运行一次。但有时你只需要在未来的特定时间执行某项任务一次。例如,你可能想在今晚凌晨 2:00 重启服务,或者在 30 分钟后创建数据库快照。
对于这类一次性任务,Linux 提供了 at 工具。
at 命令会从标准输入或文件中读取命令,并在稍后的时间执行这些命令。当任务需要延迟执行但不需要重复运行时,at 非常有用。这与 cron 的重复调度模式不同。
两者的核心区别很简单:cron 描述重复执行的计划,而 at 将一次性的未来任务加入队列。它们都是自动化工具,但解决的是不同的时间调度问题。
在本实验中,你将完成以下操作:
- 安装前置组件:确保已安装
at工具,并且其守护进程正在运行。 - 调度任务:使用
at将命令加入未来执行队列。 - 查看队列:使用
atq列出待处理任务。 - 管理任务:使用
atrm从队列中移除任务。
安装 at 工具
并非所有 Linux 发行版都会默认安装 at 命令。首先确认该工具已经安装,并且其后台服务正在运行。
与 cron 一样,at 依赖一个守护进程。你输入的命令会创建一个排队等待执行的任务定义,后台服务则负责在稍后实际运行该任务。
- 安装软件包:
sudo apt-get install -y at
at系统依赖名为atd的后台守护进程来执行已调度的命令。启动该服务:
sudo service atd start
- 确认服务处于活动状态:
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 识别任务,并在计划改变时将其移除。
总结
在本实验中,你学习了如何管理一次性任务:
- 安装:配置
at和atd。 - 调度(
at):使用at now + 5 minutes这样的语法,将未来要执行的命令加入队列。 - 列出任务(
atq):查看队列中的待处理任务 ID 和执行时间。 - 移除任务(
atrm):使用任务 ID 从队列中删除指定任务。
需要重复调度时使用 cron,需要单次延迟执行时使用 at。



