菜鸟科技网

Linux batch命令如何高效批量处理任务?

  1. batch 命令: 一个用于在系统负载较低时运行后台作业的命令,它已经被更现代的 at 命令的 -q b 选项所取代,但为了兼容性,许多系统仍然保留它。
  2. 批量处理脚本: 更常见的情况,指的是将多个 Linux 命令写在一个脚本文件(.sh)中,然后一次性执行整个脚本,这是自动化任务的核心。

下面我们分别详细介绍这两种情况。

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

第一部分:batchat 命令(定时/负载调度)

这两个命令属于同一套工具,用于安排命令或脚本在未来某个时间点运行。

at 命令 - 在指定时间运行任务

at 命令允许你在未来的某个特定时间执行一次性的任务。

基本语法: at [选项] 时间

时间格式非常灵活:

Linux batch命令如何高效批量处理任务?-图2
(图片来源网络,侵删)
  • 10:30 AM: 指定具体时间。
  • noon, midnight, teatime (下午4点): 特定时间点。
  • now + 10 minutes: 从现在开始10分钟后。
  • 3:00 PM tomorrow: 明天下午3点。
  • Jun 23: 今年的6月23号。
  • 05/30/2025 + 3 weeks: 2025年5月30号再过3周。

使用示例:

示例1:一小时后执行一个命令

at now + 1 hour
at> echo "This job ran at $(date)" > /tmp/at_job.log
at> <EOT>  # 按下 Ctrl+D 结束输入
job 5 at Wed Oct 26 14:30:00 2025

解释:

  • at now + 1 hour: 启动 at 交互式界面,任务将在一小时后执行。
  • at>: 提示符,在这里输入你想要执行的命令。
  • echo "..." >> /tmp/at_job.log: 将当前时间写入日志文件。
  • <EOT>: 按下 Ctrl+D 发送文件结束符(EOF),表示命令输入完毕。

示例2:在特定时间执行一个脚本 假设你有一个脚本 backup.sh

Linux batch命令如何高效批量处理任务?-图3
(图片来源网络,侵删)
at 2:00 AM tomorrow
at> /home/user/scripts/backup.sh
at> <EOT>
job 6 at Thu Oct 27 02:00:00 2025

常用 at 选项:

  • -f filename: 从指定文件中读取要执行的命令,而不是从标准输入。
    at -f /home/user/scripts/backup.sh now + 5 minutes
  • -latq: 列出当前等待执行的所有 at 作业。
    atq
  • -d job_idatrm job_id: 删除一个已经安排好的作业。job_id 可以通过 atq 查看。
    atrm 6

batch 命令 - 在系统负载低时运行任务

batch 命令是 at 的一个特例,它会将任务放入队列,但只有当系统的平均负载低于 0.8 时,才会执行该任务,这对于资源密集型任务(如编译、数据处理)非常有用,可以避免影响前台用户的使用。

基本语法: batch

使用示例:

batch
at> tar -czf /large_backup.tar.gz /home/user/data
at> <EOT>
job 7 at Wed Oct 26 14:31:00 2025

解释:

  • batch: 启动交互式界面。
  • 接下来的命令 tar 只会在系统负载足够低时才会被调度执行。
  • 你同样可以使用 -f 选项从一个文件读取命令:
    batch -f /path/to/heavy_script.sh

第二部分:Shell 脚本(真正的“批量处理”)

这是最常见、最强大的“批量处理”方式,通过将一系列命令写入一个文本文件(脚本),然后让 Shell 解释器来执行它们。

创建一个简单的 Shell 脚本

步骤1:创建脚本文件 使用 touchvim/nano 创建一个新文件,my_batch.sh

touch my_batch.sh

步骤2:编写脚本内容 用文本编辑器打开文件,并写入命令。

#!/bin/bash
# 这是一个简单的批量处理脚本
# 作者: Your Name
# 日期: 2025-10-26
echo "批量处理开始于: $(date)"
# 任务1: 创建一个目录并进入
echo "正在创建目录 'new_project'..."
mkdir -p /tmp/new_project
cd /tmp/new_project
echo "当前目录是: $(pwd)"
# 任务2: 创建并写入多个文件
echo "正在创建配置文件..."
echo "server=localhost" > config.conf
echo "port=8080" >> config.conf
echo "正在创建日志文件..."
echo "Application started at $(date)" > app.log
# 任务3: 查看创建的文件
echo "文件列表:"
ls -l
echo "批量处理结束于: $(date)"

代码解释:

  • #!/bin/bash: Shebang,它告诉系统这个脚本应该使用 bash 解释器来执行,这是必须的。
  • 开头的行是注释,会被 Shell 忽略。
  • echo: 在终端打印文本。
  • $(date): 命令替换,Shell 会先执行 date 命令,然后将输出结果替换到原位置。
  • mkdir -p: 创建目录,-p 选项可以创建多级目录,且如果目录已存在也不会报错。
  • cd: 更改当前目录。
  • >: 输出重定向,如果文件不存在则创建,如果存在则覆盖。
  • >>: 追加重定向,将输出追加到文件末尾,不会覆盖原有内容。

赋予执行权限并运行脚本

步骤1:赋予执行权限 默认情况下,新创建的脚本没有执行权限,你需要使用 chmod 命令来添加。

chmod +x my_batch.sh
  • +x: 添加执行权限。

步骤2:运行脚本 现在你有两种方式运行它:

方式A:直接执行(推荐)

./my_batch.sh
  • 表示在当前目录下寻找脚本,如果直接输入 my_batch.sh,系统可能会在 PATH 环境变量指定的路径中寻找,找不到就会报错。

方式B:使用解释器执行

bash my_batch.sh

这种方式不需要脚本有执行权限。

运行后,你会在终端看到类似下面的输出:

批量处理开始于: Wed Oct 26 14:35:00 CST 2025
正在创建目录 'new_project'...
当前目录是: /tmp/new_project
正在创建配置文件...
正在创建日志文件...
文件列表:
total 8
-rw-r--r-- 1 user user  27 Oct 26 14:35 app.log
-rw-r--r-- 1 user user  23 Oct 26 14:35 config.conf
-rw-r--r-- 1 user user 920 Oct 26 14:35 my_batch.sh
批量处理结束于: Wed Oct 26 14:35:00 CST 2025

你可以在 /tmp/new_project 目录下看到 config.confapp.log 这两个文件。


特性 at / batch 命令 Shell 脚本
目的 未来特定时间系统负载低时执行一次性任务。 一次性或重复性地执行一系列命令,实现自动化。
触发方式 基于时间或系统负载触发。 手动执行、由 cron 定时执行、或其他脚本调用。
核心思想 调度 组合与自动化
适用场景 每晚备份、凌晨更新、处理非紧急但耗时的任务。 系统初始化、应用部署、日志分析、数据处理流水线、日常维护任务。

对于绝大多数“批量处理”的需求,Shell 脚本是你要找的答案,而 atbatch 则是当你需要让这些脚本在非工作时间或系统空闲时自动运行时的有力补充。

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