我有一个非常奇怪的问题,无法弄清楚它是如何失去价值的。我在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
答案 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"