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

Using SSH in while loop loses attribute value

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

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

clean_file 看起来像

eclipse server101
itunes server111
appDynamics server100
itunes server102
quicktime server133

SSH 的 While 循环和函数

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 不是 运行 时,将调用检查器功能,它无法检查 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

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

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"