【发布时间】:2011-02-07 08:13:02
【问题描述】:
我有一些简单的脚本,旨在将菊花链连接在一起,以便在文件中列出的一组服务器上运行特定脚本,每行一个。
单服务器部署脚本包含以下内容:
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.
如果我注释掉 ssh 命令,循环会成功通过所有 4 台主机运行,所以我认为一旦 ssh 发生,stdio 就会被切断。此外,tcgatattr 错误让我有些担心。
我该如何解决这个问题?究竟是什么导致了 tcgetattr 错误(我什至不确定它是否相关)? 没有真正使用 shell 脚本做很多事情,如果我在这里遗漏了一些非常明显的东西,很抱歉,任何帮助都将不胜感激。
【问题讨论】:
标签: deployment shell