at 是什么
at 把一条命令或一个脚本提交到任务队列,由 atd 守护进程在指定时刻以提交者的身份执行一次。它与 cron 的分工很清楚:cron 负责固定周期重复执行,at 负责「某个时刻跑一次」。维护窗口里的延迟重启、半夜执行的一次性备份、临时抓包取证,都适合用它。
基本信息
| 适用平台 | Linux(需安装 at 包并启动 atd 服务) |
|---|---|
| 命令语法 | at 时间表达式 / at -f 脚本 时间 |
| 时间写法 | 能识别 22:00、midnight、teatime、now + 30 minutes、5pm + 3 days 等自然语言 |
| 任务管理 | at -l(等同 atq)列出队列、at -d(等同 atrm)删除任务、at -c 查看任务内容 |
| 执行身份 | 提交者的身份与提交时的环境,PATH 等变量都按当时的值保存 |
| 持久化 | 任务写在 /var/spool/at 下,机器重启后仍然有效 |
典型使用场景
- 维护窗口延迟操作:下班后自动重启服务或切换配置
- 一次性备份:大文件迁移或归档在业务低峰执行
- 延迟提醒与巡检:某一时刻触发一次健康检查
- 临时取证:在问题复现的时间点自动抓包或导出现场
- 避免手工等待:把「半小时后执行」这类动作交给队列而不是守着终端
时间表达与用法
时间表达与用法
echo '/opt/scripts/reboot-safe.sh' | at 03:00 # 今天凌晨 3 点执行一次
at now + 30 minutes # 30 分钟后
at 5pm + 3 days # 三天后下午 5 点
at midnight # 今晚 24:00
at -f /opt/scripts/backup.sh 02:30 # 直接指定脚本文件
at -m -f /opt/scripts/check.sh 09:00 # -m 完成后给提交者发邮件
at -l # 列出待执行任务
atrm 3 # 删除编号为 3 的任务交互输入方式
交互输入方式
at 02:30
tar czf /backup/etc-$(date +%F).tgz /etc >> /var/log/at-backup.log 2>&1
<Ctrl-D>时间写法与任务管理
| 写法 | 含义 | 注意 |
|---|---|---|
| now + 30 minutes | 相对当前时间 | 适合即时安排 |
| 22:00 | 今天的 22 点 | 已过则排到明天同一时刻 |
| teatime | 16:00 的别名 | 属于 at 支持的英文习惯用法 |
| 5pm + 3 days | 三天后的下午 5 点 | 可组合相对与绝对表达 |
| at -l 与 atrm | 列出与删除任务 | 删除用的是任务编号,先列后删 |
| at -c 编号 | 查看任务完整内容 | 用于确认环境变量与命令原文 |
at 任务只执行一次,需要重复执行请改用 cron 或 systemd timer。提交前确认 atd 已在运行:systemctl status atd,未启动时任务会被静默搁置,不报错也不执行。提交成功后系统会打印 job 编号,记下来便于用 atrm 取消;atq 与 at -l、atrm 与 at -d 完全等价。
at 会把任务的输出通过邮件发给提交者,容器与最小化系统里往往没有可用的邮件通道,输出就这样丢失。稳妥做法是在命令里显式重定向到日志文件(追加 2>&1),并保证目录存在。