第 8 章 · 05 `at`:一次性定时任务


文档摘要

第 8 章 · 05 :一次性定时任务 本节摘要:上一节的 解决「周期性」任务,这一节的 解决「一次性」任务——「明天上午 9 点提醒我」「今晚 11 点重启服务」「5 分钟后跑一次测试」。 与 cron 互补:cron 是「每小时/每天/每周」, 是「在某个特定时刻跑一次,跑完即销」。本节简短介绍 的用法,以及它相对「在脚本里 sleep」的优势。 内容来源:综合 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 安排一次性任务,理解它的交互式输入方式。 说清 与 cron 的定位差别:一次性 vs 周期性。 用 列出待执行任务、 删除任务。 写出常见时间表达: 、 、 。 说清 相对「脚本里 sleep」的优势(不依赖脚本常驻、关机不影响已安排任务)。

第 8 章 · 05 at:一次性定时任务

本节摘要:上一节的 cron 解决「周期性」任务,这一节的 at 解决「一次性」任务——「明天上午 9 点提醒我」「今晚 11 点重启服务」「5 分钟后跑一次测试」。at 与 cron 互补:cron 是「每小时/每天/每周」,at 是「在某个特定时刻跑一次,跑完即销」。本节简短介绍 at 的用法,以及它相对「在脚本里 sleep」的优势。

内容来源:综合 at 知识整理,套用体系化模板。

学习目标

阅读完本节,你应当能够:

  1. at 时间 安排一次性任务,理解它的交互式输入方式。
  2. 说清 at 与 cron 的定位差别:一次性 vs 周期性。
  3. atq 列出待执行任务、atrm 删除任务。
  4. 写出常见时间表达:now + 5 minutestomorrow 9am23:00
  5. 说清 at 相对「脚本里 sleep」的优势(不依赖脚本常驻、关机不影响已安排任务)。

一、设计动机:为什么需要「一次性」定时

有时候你只想在某一个特定时刻跑一次任务,不是周期:

  • 「5 分钟后检查一下部署结果」
  • 「今晚 11 点维护,届时自动重启服务」
  • 「明天早上 9 点给自己发个提醒」

这类需求用 cron 能实现(写规则 + 跑完手动删),但很别扭——cron 是为周期设计的。at 就是为「一次性」量身定做:你声明「在 X 时刻跑 Y 命令」,到点跑完,任务自动销毁,不留痕迹。

另一个解法是「脚本里 sleep 300 再执行」,但 sleep 要求脚本一直常驻,关了终端/重启机器就没了。at 由系统的 atd 守护进程管理,你退出登录、关终端,任务照样执行——这是它相对 sleep 的关键优势。

二、高频组合与实战

安排任务

at 的交互式用法:输入 at 时间 后进入交互模式,逐行输入要执行的命令,Ctrl+D 结束。

$ at now + 5 minutes at> /opt/check_deploy.sh at> <按 Ctrl+D 结束> job 1 at Tue Aug 4 10:35:00 2026 $ at 23:00 at> systemctl restart myapp at> <Ctrl+D> job 2 at Tue Aug 4 23:00:00 2026 $ at tomorrow 9am at> echo "每日站会时间" | mail user at> <Ctrl+D> job 3 at Wed Aug 5 09:00:00 2026

非交互式(管道输入,适合脚本):

echo "/opt/check_deploy.sh" | at now + 5 minutes echo "systemctl restart myapp" | at 23:00

时间表达式

at 接受非常自然的时间表达:

表达 含义
now + 5 minutes 现在 + 5 分钟
now + 2 hours 2 小时后
10:30 今天 10:30(若已过则明天)
23:00 2026-08-15 指定日期时间
tomorrow 明天此时
tomorrow 9am 明天 9 点
midnight 今晚午夜

管理任务

atq # 列出所有待执行的 at 任务(显示 job 号与时间) atrm 2 # 删除 job 号为 2 的任务 at -c 1 # 查看 job 1 的详细内容(会跑什么)

atq 列出的「job 号」是 atrm 删除用的标识。

三、踩坑与排错

坑 1:atd 没装/没启动

at now + 1 minute # 报错: "Cannot find atd" 或类似

某些发行版默认不装 atd。apt install atyum install at,然后 systemctl enable --now atd

坑 2:权限——at 控制谁能用

echo "cmd" | at now + 1 min # 报错: "You do not have permission to use at"

at/etc/at.allow//etc/at.deny 控制谁能用。若被挡,联系管理员把你加入 /etc/at.allow(或从 at.deny 删除)。

坑 3:与 cron 一样的环境坑

at 执行的环境同样极简(无你的 .bashrc、PATH 不全),命令同样建议用绝对路径、显式定义所需变量。

本节要点回顾

  1. at 安排一次性定时任务,与 cron(周期)互补;任务跑完自动销毁。
  2. 交互式:at 时间 → 输入命令 → Ctrl+D;非交互:echo cmd | at 时间(脚本用)。
  3. 时间表达自然:now + 5 minutes23:00tomorrow 9ammidnight
  4. 管理:atq 列任务、atrm N 删任务、at -c N 看详情。
  5. 相对 sleep 的优势:由 atd 守护,退出登录/关终端任务仍执行,不依赖脚本常驻。
  6. 环境坑同 cron:命令用绝对路径、显式定义变量。

下一节讲用户与组管理——useradd/passwd/usermod,这是「谁能用这套系统」的基础。


发布者: 作者: 灏天文库 转发
评论区 (0)
U