核心概念:at vs. batch
at: 用于在指定的时间点执行一次性的任务。“明天上午9点执行这个脚本”。batch: 用于在系统负载较低的时侯执行任务,它会把任务提交到队列中,由atd守护进程在系统负载平均值低于 0.8 时自动执行,这对于不紧急但耗资源的任务(如编译、备份、数据分析)非常有用,可以避免影响系统性能。
batch 是 at 的一个“智能”变种,它不让你指定具体时间,而是让系统自己选择一个合适的“空闲”时间。

at 命令详解
at 命令允许你安排一个命令或一个脚本在未来的某个时间运行一次。
前提条件
at 命令的正常工作依赖于 atd 守护进程。
# 检查 atd 服务是否正在运行 systemctl status atd # 如果没有运行,则启动它 sudo systemctl start atd # 设置为开机自启 sudo systemctl enable atd
基本用法
步骤 1:输入要执行的命令
在 shell 提示符下,输入 at <时间>,然后按回车,之后你就可以输入要执行的命令,每输入一行按一次回车,输入完成后,按 Ctrl + D 发送 EOF (End of File) 信号来结束输入。
步骤 2:指定时间 时间格式非常灵活,以下是一些示例:

- 绝对时间:
at 10:30 PM(今天晚上10:30)at 9:00(明天上午9点,默认是明天)at 2025-12-25(2025年12月25号,午夜)at 10:15 Dec 25(12月25号上午10:15)
- 相对时间:
at now + 5 minutes(从现在起5分钟后)at now + 3 hours(从现在起3小时后)at tomorrow(明天这个时候)at noon + 2 days(后天中午12点)
- 特殊关键词:
at midnight(午夜)at noon(中午)at teatime(下午4点,英国的下午茶时间)
实例演示
示例 1:5分钟后发送一封邮件
at now + 5 minutes at> echo "This is a test email from at command." | mail -s "AT Test" your-email@example.com at> <EOT> # 按 Ctrl + D job 5 at Tue Oct 26 10:35:00 2025
这里的 <EOT> 是你按 Ctrl + D 后系统显示的,表示输入结束。
示例 2:明天凌晨3点执行一个备份脚本
假设你的备份脚本在 /home/user/backup.sh。
at 3:00 AM tomorrow at> /home/user/backup.sh at> <EOT> job 6 at Wed Oct 27 03:00:00 2025
常用选项
-l或atq: 列出当前用户的at作业队列。atq # 输出示例: # 5 Tue Oct 26 10:35:00 2025 a user # 6 Wed Oct 27 03:00:00 2025 a user
-d <job_id>或atrm <job_id>: 删除指定的作业。atrm 5 # 删除作业ID为5的任务
-c <job_id>: 显示指定作业的详细内容(包括你输入的所有命令和环境变量)。atc 6
batch 命令详解
batch 命令的用法比 at 简单得多,因为它不需要你指定时间。
基本用法
直接输入 batch 命令,然后像使用 at 一样输入你的命令,最后用 Ctrl + D 结束。
batch
at> # 现在可以输入耗资源的命令了
at> for i in {1..1000000}; do echo $i > /dev/null; done
at> <EOT>
job 7 at Tue Oct 26 10:40:00 2025
batch 会立即将这个任务提交给 atd。atd 会不断检查系统的负载平均值,只有当负载低于 0.8 时,它才会从 batch 队列中取出任务来执行。
与 at 的关系
batch 命令实际上就是 at 的一个别名,它默认使用 batch 队列,你可以通过查看 /etc/at.deny 和 /etc/at.allow 文件来控制哪些用户可以使用 at 和 batch 命令。
atq 和 atrm 的使用
这两个命令是管理 at 和 batch 作业的核心工具。
-
atq(at queue)- 作用: 列出当前用户待执行的所有
at作业。 - 输出格式:
作业ID 运行时间 队列 用户作业ID: 用于删除或查看作业。运行时间: 作业计划执行的时间。队列**: 通常是a(at) 或b(batch)。batch作业的队列就是b`。用户: 提交作业的用户。
atq # 输出示例: # 7 Tue Oct 26 10:40:00 2025 b user <-- 这是一个 batch 作业 # 6 Wed Oct 27 03:00:00 2025 a user <-- 这是一个 at 作业
- 作用: 列出当前用户待执行的所有
-
atrm(at remove)- 作用: 从队列中删除一个或多个作业。
- 用法:
atrm <job_id1> <job_id2> ...
# 删除 batch 作业 (ID=7) atrm 7 # 删除 at 作业 (ID=6) atrm 6
权限与安全
系统通过两个文件来控制用户使用 at 和 batch 的权限:
/etc/at.allow: 如果这个文件存在,那么只有列在这个文件里的用户才能使用at和batch。/etc/at.deny:/etc/at.allow不存在,系统会检查这个文件,列在这个文件里的用户不能使用at和batch,如果这个文件不存在或为空,则所有用户都可以使用(前提是他们有执行at命令的权限)。
默认情况下,很多系统会有一个 /etc/at.deny 文件,里面包含 daemon、bin、sys 等系统用户。
at/batch vs. cron
at/batch 和 cron 是 Linux 定时任务的两大工具,但用途不同。
| 特性 | at / batch |
cron |
|---|---|---|
| 执行类型 | 一次性任务 (一次性) | 周期性任务 (周期性) |
| 执行时间 | 指定的未来某个时间点或系统空闲时 | 固定的时间间隔 (如每天、每小时、每分钟) |
| 配置方式 | 命令行交互式输入 | 编辑配置文件 (crontab -e) |
| 适用场景 | - 临时备份 - 一次性数据处理 - 计划在低负载时运行的任务 |
- 定期日志清理 - 每日数据备份 - 定时健康检查 |
| 守护进程 | atd |
crond |
简单总结:
- 用
at/batch:当你想“让这件事在未来的某个时候只做一次”或“在系统不忙的时候做一次”。 - 用
cron:当你想“让这件事每天都做一次”或“每5分钟检查一次”。
| 命令 | 主要用途 | 时间控制 | 关键命令 |
|---|---|---|---|
at |
一次性任务 | 指定具体时间点 | at <time>, atq, atrm |
batch |
一次性任务 | 系统负载低时自动执行 | batch, atq, atrm |
掌握 at 和 batch 命令,可以让你在 Linux 系统中非常灵活地管理一次性任务,是系统管理员和开发者的必备技能。
