第 8 章 · 05 :一次性定时任务 本节摘要:上一节的 解决「周期性」任务,这一节的 解决「一次性」任务——「明天上午 9 点提醒我」「今晚 11 点重启服务」「5 分钟后跑一次测试」。 与 cron 互补:cron 是「每小时/每天/每周」, 是「在某个特定时刻跑一次,跑完即销」。本节简短介绍 的用法,以及它相对「在脚本里 sleep」的优势。 内容来源:综合 知识整理,套用体系化模板。 学习目标 阅读完本节,你应当能够: 用 安排一次性任务,理解它的交互式输入方式。 说清 与 cron 的定位差别:一次性 vs 周期性。 用 列出待执行任务、 删除任务。 写出常见时间表达: 、 、 。 说清 相对「脚本里 sleep」的优势(不依赖脚本常驻、关机不影响已安排任务)。
at:一次性定时任务本节摘要:上一节的
cron解决「周期性」任务,这一节的at解决「一次性」任务——「明天上午 9 点提醒我」「今晚 11 点重启服务」「5 分钟后跑一次测试」。at与 cron 互补:cron 是「每小时/每天/每周」,at是「在某个特定时刻跑一次,跑完即销」。本节简短介绍at的用法,以及它相对「在脚本里 sleep」的优势。
内容来源:综合
at知识整理,套用体系化模板。
阅读完本节,你应当能够:
at 时间 安排一次性任务,理解它的交互式输入方式。at 与 cron 的定位差别:一次性 vs 周期性。atq 列出待执行任务、atrm 删除任务。now + 5 minutes、tomorrow 9am、23:00。at 相对「脚本里 sleep」的优势(不依赖脚本常驻、关机不影响已安排任务)。有时候你只想在某一个特定时刻跑一次任务,不是周期:
这类需求用 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 删除用的标识。
at now + 1 minute # 报错: "Cannot find atd" 或类似
某些发行版默认不装 atd。apt install at 或 yum install at,然后 systemctl enable --now atd。
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 删除)。
at 执行的环境同样极简(无你的 .bashrc、PATH 不全),命令同样建议用绝对路径、显式定义所需变量。
at 安排一次性定时任务,与 cron(周期)互补;任务跑完自动销毁。at 时间 → 输入命令 → Ctrl+D;非交互:echo cmd | at 时间(脚本用)。now + 5 minutes、23:00、tomorrow 9am、midnight。atq 列任务、atrm N 删任务、at -c N 看详情。下一节讲用户与组管理——useradd/passwd/usermod,这是「谁能用这套系统」的基础。