在 bash 中多线程 Expect 脚本

问题描述 投票:0回答:1

我有一个在 RH Linux 上运行的 bash 脚本,它接收设备列表、循环访问该列表并调用 Expect 脚本以通过 SSH 连接到每个设备。

#!/bin/bash
while read device
do

 /home/bin/get-device-expect.sh $device

done < /home/files/device_list.txt

Expect 脚本将通过 SSH 连接到每个设备,运行一些命令并将输出转储到 $device.txt 文件。

对于 500 个设备,这个循环需要很长时间。 我怎样才能多线程呢? 我可能不希望它尝试同时登录 500 台设备。但也许可以先做 20 个,然后再做下 20 个,依此类推。 一次指定“n”个设备的方法会很棒。

linux bash multithreading expect
1个回答
0
投票

假设:

  • devices_list.txt
    中的每个设备都由一个没有嵌入空格的字符串组成

设置:

$ cat device_list.txt
device_1
device_2
device_3
device_4
device_5
device_6
device_7
device_8
device_9

$ cat get_device.sh
#!/bin/bash

echo "input: $@"
sleep 4

一个想法是使用

xargs

cat device_list.txt | xargs -r -P4 -n1 ./get_device.sh

### or

xargs -r -P4 -n1 ./get_device.sh < device_list.txt

地点:

  • -P4
    - 最多并行运行 4 个副本
  • -n1
    - 每次调用
    ./get_device.sh
    都会接收一个参数(也称为设备)作为输入;删除
    -n1
    以查看如果不包含此限制会发生什么情况

以上两者都会生成以下内容:

input: device_1          # 4 lines of output in quick succession
input: device_2
input: device_3
input: device_4
                         # 4-sec delay
input: device_5          # 4 lines of output in quick succession
input: device_6
input: device_7
input: device_8
                         # 4-sec delay
input: device_9          # only 1 device left so only one instance of get_device.sh is called
                         # 4-sec delay
© www.soinside.com 2019 - 2024. All rights reserved.