命令是干什么的
batch 把任务交给 at 服务的批处理队列:任务不按指定时刻执行,而是等系统负载降到阈值以下才由 atd 启动,它回答的是等机器闲下来再跑这个问题。编译、重建索引、大文件压缩这类可等待的重活都适合它。任务提交到 b 队列,与 at 提交的 a 队列分开管理,用 atq 或 at -l 能看到,删除同样用 atrm。判断依据是 atd 读取的一分钟平均负载,阈值通常记为 1.5。
基本信息
| 适用平台 | Linux,属于 at 软件包,需要 atd 守护进程在运行 |
|---|---|
| 语法 | batch 回车后逐行输入命令,结束时按输入结束符;batch -f 脚本 直接提交文件 |
| 常用选项 | -f 指定脚本文件、-m 无论有无输出都发邮件、-q 指定队列 |
| 队列归属 | batch 提交到 b 队列,at 提交到 a 队列,atq 会显示队列字母 |
| 触发条件 | atd 判断系统一分钟平均负载低于阈值时启动,通常为 1.5 以下 |
| 权限要求 | 普通用户可用,但可能受 at 的名单文件限制 |
典型使用场景
- 重建全文索引、生成报表、批量转码这类重活,等业务低谷再跑
- 大文件压缩与归档,避开白天磁盘与 CPU 的双高峰
- 一次性数据迁移或校验任务,不关心具体时刻只关心不影响线上
- 与 nice、ionice 组合,启动后再降一级优先级,做成温和的后台任务
- 临时补跑历史批处理,避免在高峰时段继续加压
- 给周期性任务做兜底:到点时机器太忙就先进队列等着
示例
示例
batch -f /opt/scripts/reindex.sh # 直接提交脚本文件
batch <<'EOF'
ionice -c3 nice -n 19 /opt/app/rebuild-index.sh
EOF
batch -m -f /opt/scripts/report.sh # 无论有没有输出都发邮件通知
echo '/opt/scripts/vacuum.sh' | batch # 从管道提交单条命令
atq # batch 任务同样列在 atq 里,队列字母为 b
at -c 3 | tail -n 10 # 提交后核对任务内容
atrm 3 # 不再需要时按编号删除任务batch 与 cron 的差异
| 对比项 | batch 提交的任务 | cron 定时任务 |
|---|---|---|
| 触发方式 | 负载驱动,等系统负载降下来才启动 | 时间驱动,到点就启动 |
| 时间承诺 | 没有固定执行时间,可能长时间排队 | 有明确执行时刻,用表达式描述 |
| 查看方式 | 提交到 b 队列,用 atq 或 at -l 查看 | 用 crontab -l 查看,与 at 队列独立 |
| 适合的任务 | 可等待的重活,如编译、索引、归档 | 必须准时的巡检、报表、日志轮转 |
| 删除方式 | atrm 任务编号 | crontab -e 删掉对应行 |
负载阈值看的是全局一分钟平均负载,多核机器上负载 1.5 很容易被超过,重活可能长期排队;有明确时限的任务不要只丢进 batch,应规划固定窗口或交给 cron。
atd 只看全局负载,不区分是 CPU 繁忙还是磁盘等待。大量处于不可中断状态的进程同样会把负载顶高,此时 CPU 可能空闲但 batch 依旧不启动。
任务输出默认通过邮件发给提交者,机器上没有邮件服务时输出全部丢弃;批处理脚本应自行把日志重定向到文件,否则失败也无声无息。