You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中为Expect脚本实现指定并发数的多线程执行?

限制并发数批量执行SSH设备任务的实现方案

针对你在RH Linux下批量处理500台设备SSH任务、需要控制并发数(如20台)的需求,以下是三种实用的实现方案:

方案一:纯Bash内置进程控制(无需额外工具)

利用Bash的wait命令和计数器,手动控制同时运行的进程数量,适合环境受限无法安装额外工具的场景。

实现代码

假设你的设备列表文件为devices.txt(每行一个设备IP/主机名),Expect脚本为ssh_expect.sh(接收设备名作为参数,输出到$1.txt),主Bash脚本如下:

#!/bin/bash
MAX_CONCURRENT=20
counter=0

# 循环读取设备列表
while read device; do
    # 启动Expect脚本后台执行
    ./ssh_expect.sh "$device" &
    counter=$((counter + 1))

    # 达到最大并发数时,等待任意一个后台进程结束
    if [ $counter -ge $MAX_CONCURRENT ]; then
        wait -n
        counter=$((counter - 1))
    fi
done < devices.txt

# 等待剩余所有后台进程完成
wait
echo "所有设备任务执行完毕"

关键说明

  • wait -n:等待任意一个后台进程结束,避免一次性等待所有进程,保证并发数始终维持在阈值内
  • 最后一行的wait:确保所有剩余的后台任务都执行完成后再退出脚本

方案二:使用xargs的-P参数(系统默认自带)

RH Linux默认安装的xargs支持-P参数指定并发进程数,实现起来更简洁。

实现命令

直接通过管道传递设备列表给xargs,控制并发数:

cat devices.txt | xargs -I {} -P 20 ./ssh_expect.sh {}

关键说明

  • -I {}:用{}替换管道传入的每个设备名
  • -P 20:指定最大并发数为20
  • 若设备列表中有空格或特殊字符,可添加-d '\n'参数确保每行作为一个独立参数:
    xargs -d '\n' -I {} -P 20 ./ssh_expect.sh {} < devices.txt
    

方案三:使用GNU Parallel(功能更强大)

GNU Parallel是专门用于批量并行执行任务的工具,支持失败重试、进度显示等高级功能,RH Linux可通过yum install parallel安装。

实现命令

parallel -j 20 ./ssh_expect.sh {} :::: devices.txt

关键说明

  • -j 20:指定最大并发数为20
  • :::: devices.txt:从文件读取任务参数(每行一个设备)
  • 如需查看执行进度,可添加--progress参数;如需重试失败任务,可添加--retries 3参数

额外注意事项

  1. Expect脚本优化:确保你的ssh_expect.sh设置了SSH超时时间,避免进程因连接超时挂起占用并发资源,例如在Expect中添加:
    set timeout 30
    
  2. 输出文件唯一性:确认Expect脚本中使用传入的设备参数作为输出文件名(如$argv0.txt或$1.txt),避免文件覆盖
  3. 资源监控:可通过htop或ps aux | grep ssh_expect实时监控并发进程数量,调整MAX_CONCURRENT值以匹配系统负载

内容的提问来源于stack exchange,提问作者Roger McCarrick

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:57:33