在 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"
我有一个很奇怪的问题,无法弄清楚它是如何丢失这些值的。我在 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"