我正在尝试阅读一个列表,我想在列表中一次阅读 25 个,然后休眠 5 秒钟,然后一次继续阅读 25 个,直到我用完列表。
这就是我现在正在做的事情,但是我同时启动了太多的 ssh 会话。我希望能够运行 25 次,睡眠 5 秒,再运行 25 次,直到列表用完为止。
cat ctrlnodes.txt |\
while read N
do
ssh -n $N "/var/opt/OV/bin/instrumentation/agent_health.sh" &
done
for i in $(seq 1 100 )
do
for j in $(seq 1 25)
do
# suppose you have an array
echo ${your_list[i]}
done
sleep 5
done
让我们创建一个包含一个整数/行、100 行的文件:
$ seq 1 100 > data
使用以下脚本:
#!/bin/bash
n=1
while read N
do
# here you call your ssh
if [ $((n % 25)) -eq 0 ]
then
echo "Spawned 25 subprocesses, waiting..."
echo $n, $N
# wait for all subprocesses to finish before continuing
# Replace 'wait' with 'sleep 5' if that's desired
wait
fi
((n+=1))
done < data
输出:
$ ./s.sh
Spawned 25 subprocesses, waiting...
25, 25
Spawned 25 subprocesses, waiting...
50, 50
Spawned 25 subprocesses, waiting...
75, 75
Spawned 25 subprocesses, waiting...
100, 100
counter=0
while read N; do
((counter++))
ssh -n $N "/var/opt/OV/bin/instrumentation/agent_health.sh" &
[[ $(($counter % 25)) = 0 ]] && sleep 5
done <ctrlnodes.txt
首先,需要在循环之前初始化一个计数器,并在每次迭代中递增;这允许脚本测试它是否在可以被25
.
其次,您需要将cat
文本文件的管道更改while
为直接输入重定向done
;当您使用前者时,会创建一个子shell,$counter
它将超出范围并且不会正确增加。
最后,可能最需要解释的是可整除测试本身:
[[ $(($counter % 25)) = 0 ]] && sleep 5
它的作用是测试25
计数器的模数是否为零。(即,$counter
可被 整除25
)如果是,则测试的退出值为真,因此“和”(&&
)可以继续执行sleep
命令;如果模值不为零,&&
则不会继续,因为测试将具有错误的退出值。
概念的单线测试:
seq 1 100 >numbers.txt && counter=0 && while read N; do ((counter++)); echo $N; [[ $(($counter % 25)) = 0 ]] && echo -n sleeping... && sleep 5 && echo; done <numbers.txt
您应该看到的是由 25 个数字组成的块,一条“正在睡觉……”的行,停顿 5 秒,直到它通过所有 1..100。