为什么bash的循环部署脚本似乎只工作一次?(Why does bash loop deploy s

2019-10-28 14:13发布

我有打算菊花链在一起,在一组都在一个文件中列出了服务器,每行一个的运行特定的脚本,一些简单的脚本。

单一服务器部署脚本包含以下内容:

  1 #!/bin/bash
  2 
  3 file=$1
  4 host=$2
  5 
  6 scp ${file} ${host}:/tmp/
  7 USER=`whoami`
  8 ssh -t -t $USER@${host} /tmp/${file}
  9 
 10 ssh "${host}" /bin/rm /tmp/${file}
 11 exit

它工作正常上一个脚本我有百胜安装Tomcat和符号链接的Hadoop / HBase的CONFIGS到共享目录类。

第二个主要文件是deploy-all.sh其目的是解析主机列表和运行部署脚本,所有的人:

  1 #!/bin/bash
  2 
  3 script=$1
  4 
  5 cat dumbo-hosts | while read fileline
  6 do
  7 echo ${fileline}
  8 ./deploy.sh ${script} ${fileline}
  9 
 10 sleep 10
 11 done

什么情况是,脚本运行一次,然后for循环被打破......我有类似以下的输出:

$ ./deploy-all.sh setup-tomcat.sh 
line is hadoop01.myhost
setup-tomcat.sh                               100%  455     0.4KB/s   00:00    
tcgetattr: Inappropriate ioctl for device
hadoop02.myhost
hadoop03.myhost
hadoop04.myhost
<succesful output of hadoop01 task>
...
Connection to hadoop01.myhost closed.

如果我注释掉SSH命令循环成功地通过所有4台主机上运行,​​所以我假定这涉及一旦发生SSH STDIO被截断的东西。 另外,tcgatattr错误我担心一些。

我怎样才能解决这个问题? 究竟是什么导致了tcgetattr错误(我甚至不知道,如果是相关的)? 还没有真正做了很多与shell脚本很抱歉,如果我失去了一些东西真的很明显这里,任何帮助,将不胜感激。

Answer 1:

这是与作为子进程的一部分运行时,SSH重用的标准输入文件描述符的问题。

解决方法是从非终端上下文调用SSH时使用“-n”。

option=-n
tty -s 2>/dev/null && option=

scp ${file} ${host}:/tmp/
ssh $option -t ${host} /tmp/${file}
ssh $option ${host} rm /tmp/${file}


Answer 2:

我解决了这个通过使用bash阵列线临时存储到一个数组,以避免中断标准输入...但感觉错了......如果任何人有解决这个得到一个更好的方法,请让我知道。

这里是我的解决方案:

  1 #/bin/bash
  2 
  3 #myscript = $1
  4 count=0
  5 
  6 declare -a lines
  7 
  8 while read line
  9 do
 10   lines[$count]=$line
 11   ((count++))
 12 done < dumbo-hosts
 13 
 14 for i in "${lines[@]}"
 15 do
 16   echo "$i"
 17   ./deploy.sh "$1" "${i}"
 18 done


文章来源: Why does bash loop deploy script only seem to work once?