菜鸟科技网

Linux batch命令如何高效批量处理文件?

核心概念:at vs. batch

  • at: 用于在指定的时间点执行一次性的任务。“明天上午9点执行这个脚本”。
  • batch: 用于在系统负载较低的时侯执行任务,它会把任务提交到队列中,由 atd 守护进程在系统负载平均值低于 0.8 时自动执行,这对于不紧急但耗资源的任务(如编译、备份、数据分析)非常有用,可以避免影响系统性能。

batchat 的一个“智能”变种,它不让你指定具体时间,而是让系统自己选择一个合适的“空闲”时间。

Linux batch命令如何高效批量处理文件?-图1
(图片来源网络,侵删)

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:指定时间 时间格式非常灵活,以下是一些示例:

Linux batch命令如何高效批量处理文件?-图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

常用选项

  • -latq: 列出当前用户的 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 会立即将这个任务提交给 atdatd 会不断检查系统的负载平均值,只有当负载低于 0.8 时,它才会从 batch 队列中取出任务来执行。

at 的关系

batch 命令实际上就是 at 的一个别名,它默认使用 batch 队列,你可以通过查看 /etc/at.deny/etc/at.allow 文件来控制哪些用户可以使用 atbatch 命令。


atqatrm 的使用

这两个命令是管理 atbatch 作业的核心工具。

  • 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

权限与安全

系统通过两个文件来控制用户使用 atbatch 的权限:

  1. /etc/at.allow: 如果这个文件存在,那么只有列在这个文件里的用户才能使用 atbatch
  2. /etc/at.deny: /etc/at.allow 不存在,系统会检查这个文件,列在这个文件里的用户不能使用 atbatch,如果这个文件不存在或为空,则所有用户都可以使用(前提是他们有执行 at 命令的权限)。

默认情况下,很多系统会有一个 /etc/at.deny 文件,里面包含 daemonbinsys 等系统用户。


at/batch vs. cron

at/batchcron 是 Linux 定时任务的两大工具,但用途不同。

特性 at / batch cron
执行类型 一次性任务 (一次性) 周期性任务 (周期性)
执行时间 指定的未来某个时间点系统空闲时 固定的时间间隔 (如每天、每小时、每分钟)
配置方式 命令行交互式输入 编辑配置文件 (crontab -e)
适用场景 - 临时备份
- 一次性数据处理
- 计划在低负载时运行的任务
- 定期日志清理
- 每日数据备份
- 定时健康检查
守护进程 atd crond

简单总结:

  • at/batch:当你想“让这件事在未来的某个时候只做一次”或“在系统不忙的时候做一次”。
  • cron:当你想“让这件事每天都做一次”或“每5分钟检查一次”。

命令 主要用途 时间控制 关键命令
at 一次性任务 指定具体时间点 at <time>, atq, atrm
batch 一次性任务 系统负载低时自动执行 batch, atq, atrm

掌握 atbatch 命令,可以让你在 Linux 系统中非常灵活地管理一次性任务,是系统管理员和开发者的必备技能。

分享:
扫描分享到社交APP
上一篇
下一篇