Deployment 为什么bash循环部署脚本似乎只工作一次?

Deployment 为什么bash循环部署脚本似乎只工作一次?,deployment,shell,Deployment,Shell,我有几个简单的脚本,它们可以菊花链在一起,在一组服务器上运行特定的脚本,所有这些脚本都列在一个文件中,每行一个 单服务器部署脚本包含以下内容: 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/${f

我有几个简单的脚本,它们可以菊花链在一起,在一组服务器上运行特定的脚本,所有这些脚本都列在一个文件中,每行一个

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

  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
它在我拥有的一个脚本上运行良好,即yum安装tomcat并将hadoop/hbase配置符号链接到共享类目录

第二个主要文件是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.
$。/deploy-all.sh setup-tomcat.sh
行是hadoop01.myhost
setup-tomcat.sh 100%4550.4KB/s 00:00
tcgetattr:设备的ioctl不正确
hadoop02.myhost
hadoop03.myhost
hadoop04.myhost
...
与hadoop01.myhost的连接已关闭。
如果我注释掉ssh命令,那么循环将成功地通过所有4台主机运行,因此我认为这涉及到stdio在ssh发生后被切断。此外,tcgatattr错误在某种程度上与我有关

我怎样才能避开这件事?究竟是什么导致了tcgetattr错误(我甚至不确定它是否相关)?
我还没有对shell脚本做太多工作,所以很抱歉,如果我在这里遗漏了一些非常明显的内容,我们将非常感谢您的帮助。

我通过使用bash数组将这些行临时存储到一个数组中来解决这一问题,以避免stdin中断。。。但是感觉不对。。。如果有人有更好的方法来解决这个问题,请告诉我

以下是我的解决方案:

  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
1#/bin/bash
2.
3#myscript=$1
4计数=0
5.
6声明-a行
7.
8读行时
9做
10行[$count]=$line
11((count++)
12个小飞象主机
13
14表示“${lines[@]}”中的i
15做
16回声“$i”
17./deploy.sh“$1”“${i}”
18完成

作为子流程的一部分运行时,ssh重用stdin文件描述符是一个问题

解决方法是在从非终端上下文调用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}

这解决了我的问题,谢谢。仍然得到一个tcgetattr:ioctl for device error不合适,但是脚本正在正确运行。我认为这是由ssh的“-t”选项引起的。我相信较新版本的ssh有一个更容易理解的错误消息。同样的问题,可以通过
rsh
解决。