【问题标题】:Why does bash loop deploy script only seem to work once?为什么 bash 循环部署脚本似乎只工作一次?
【发布时间】: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


    【解决方案1】:

    我通过使用 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
    

    【讨论】:

      【解决方案2】:

      作为子进程的一部分运行时,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}
      

      【讨论】:

      • 这解决了我的问题,谢谢。仍然收到 tcgetattr: Inappropriate ioctl for device 错误,但脚本运行正常
      • 我认为这是由 ssh 的“-t”选项引起的。我相信较新版本的 ssh 有更易于理解的错误消息。
      • 同样的问题并用rsh修复。
      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多