而shell脚本中的循环并没有读取输入文件中的所有行

而shell脚本中的循环并没有读取输入文件中的所有行,shell,while-loop,scripting,Shell,While Loop,Scripting,我有下面的shell脚本,预计它将在300台服务器上并行运行该命令,但它读取的是列表中50到90台服务器 请强调一下,为什么它不能从列表中选择/读取所有服务器 #!/bin/bash tmpdir=${TMPDIR:-/home/user1}/output.$$ mkdir -p $tmpdir count=0 while IFS= read -r host; do ssh -o BatchMode=yes ${host} hostname -f > ${tmpdir}/$

我有下面的shell脚本,预计它将在300台服务器上并行运行该命令,但它读取的是列表中50到90台服务器

请强调一下,为什么它不能从列表中选择/读取所有服务器

#!/bin/bash

tmpdir=${TMPDIR:-/home/user1}/output.$$

mkdir -p $tmpdir

count=0

while IFS= read -r host; do
    ssh -o BatchMode=yes ${host} hostname -f > ${tmpdir}/${host} 2>&1 &
    count=`expr $count + 1`

done < all_nodes.list

while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`

done

echo "Output for hosts are in $tmpdir"
exit 0
#/bin/bash
tmpdir=${tmpdir:-/home/user1}/output$$
mkdir-p$tmpdir
计数=0
而IFS=read-r主机;做
ssh-o BatchMode=yes${host}hostname-f>${tmpdir}/${host}2>&1&
count=`expr$count+1`
完成
不清楚什么是
$pids
,所以我无法评论第二个循环运行了多少次。在第一个循环中,每个
ssh
进程本身可能消耗一行或多行用于
read
命令;改用
ssh-n…
。(如果
pids
真的没有定义,那么
wait$pids
相当于
wait
,这意味着第一次迭代会一直阻塞,直到所有后台作业完成,而未来的迭代只会立即减少
count
。@Chepner,pids是用于创建输出目录的进程ID。实际上,我是从google it self那里得到这个逻辑的,所以,我对脚本中的行不太熟悉,但不知怎的,我使用较少的节点,比如10到20个节点。顺便说一句,
count=$((count+1))
将在所有兼容1992 POSIX sh标准的shell上工作,并且比调用外部命令(如
expr
快得多。此外,考虑添加额外引用作为指导。@查尔斯达菲…谢谢你的链接。