而shell脚本中的循环并没有读取输入文件中的所有行
我有下面的shell脚本,预计它将在300台服务器上并行运行该命令,但它读取的是列表中50到90台服务器 请强调一下,为什么它不能从列表中选择/读取所有服务器而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}/$
#!/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
快得多。此外,考虑添加额外引用作为指导。@查尔斯达菲…谢谢你的链接。