我有一个在 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”个设备的方法会很棒。
假设:
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