1

我正在尝试阅读一个列表,我想在列表中一次阅读 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
4

3 回答 3

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
于 2013-10-03T18:24:11.810 回答
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
于 2013-10-03T19:59:27.590 回答
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。

于 2013-10-03T20:01:51.193 回答