如果在5次检查后找不到关联的屏幕,我正在写一个脚本来重启一个过程:
f=0
while true; do(
for s in server1 server2 server3; do(
if ! screen -ls|grep -q "$s"; then(
f=$(($f + 1))
#Here, f is always 1 more than the value
#I set at the beginning of the script
echo "$s missed $f heartbeats"
)else(
f=0
)fi
if [ "$f" -ge 5 ]; then(
echo "`date`: $s down, starting"
/path/to/start/script
)fi
)done
sleep 1
#f is 0 here
)done
在while循环的每次迭代之后, f
被设置回初始值,即使我没有在循环中设置f
。我怎样才能使我的反击持续存在?
答案 0 :(得分:4)
用于封闭每个循环的主体和if
语句的不必要的括号形成子shell,并且对子shell中的变量所做的任何更改都是该shell的本地变量,并在子shell退出时消失。
f=0
while true; do
for s in server1 server2 server3; do
if ! screen -ls|grep -q "$s"; then
f=$(($f + 1))
echo "$s missed $f heartbeats"
else
f=0
fi
if [ "$f" -ge 5 ]; then
echo "`date`: $s down, starting"
/path/to/start/script
fi
done
sleep 1
done
来自bash
手册页的SHELL GRAMMAR部分(强调我的):
(list)列表在子shell环境中执行(请参阅下面的COMMAND EXECUTION ENVIRONMENT)。 影响shell环境的变量赋值和内置命令在命令后不会保持有效 完成。返回状态是列表的退出状态。