在while循环中使用SSH会丢失属性值

时间:2015-01-19 22:47:48

标签: linux shell ssh

我有一个非常奇怪的问题,无法弄清楚它是如何失去价值的。我在clean_file中有5个服务器名称值。假设我必须SSH第4服务器,重新启动某个应用程序,然后while循环没有完成循环,而是在启动应用程序后它在第4个值之后立即停止。

grep -v -e"#" $HOST | awk '{print $2"     "$4"     "$5}'| grep -e^windows -e^linux -e^red > $DIRECTORY/clean_file

clean_file看起来像

eclipse server101
itunes server111
appDynamics server100
itunes server102
quicktime server133

While Loop& SSH的功能

while read -r line
do 
  #check for application status
  mcstat -q -n $name | grep "Processing"
  if [ $? -eq 0 ]; then
     echo " works like a charm $name"
  else
     i=$name
     checker
  fi
done < "$DIR/clean_file"

function checker(){
    while [ $j -lt 3 ]; do
       ssh $server 'mcell -q -n "'"$i"'"' || echo "error 101"
       sleep 15
       ssh $server 'mcstat -q -n "'"$i"'"' || echo "error 102"
       echo " I made it work like a charm $i"
   j=$((j+1))
   done
}

输出

当所有应用程序都很好并且没有调用函数检查器时

works like a charm eclipse 
works like a charm itunes
works like a charm appDynamics
works like a charm itunes
works like a charm quicktime

当server102上的itunes没有运行时,将调用checker函数&amp;它无法检查server133上的quicktime应用程序状态

works like a charm eclipse 
works like a charm itunes
works like a charm appDynamics
I made it work like a charm itunes

1 个答案:

答案 0 :(得分:1)

while循环内部运行的命令可以访问while循环的标准输入。 ssh通常从标准输入读取,因此它消耗循环的输入。要防止ssh读取标准输入,请将其输入从/dev/null重定向或使用-n标志运行:

ssh $server 'mcell -q -n "'"$i"'"' < /dev/null || echo "error 101"

ssh -n $server 'mcell -q -n "'"$i"'"' || echo "error 101"

或者,您可以立即保护在循环中运行的所有内容:

while read -r line
do
    {
        mcstat -q -n $name ...
    } < /dev/null
done < "$DIR/clean_file"