我试图通过列表读取,我想在列表中一次读取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
答案 0 :(得分:0)
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
答案 1 :(得分:0)
让我们创建一个包含一个整数/行,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
答案 2 :(得分:0)
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。