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
解决。