0

我有这个脚本来检查网络服务器是否启动并且健康检查是否成功。我在服务开始之前使用“睡眠”。我正在寻求改进它,并放置一些“迭代/直到”选项来检查服务健康检查是否成功,但会超时 60/120 秒并进行 LB 注册,否则会引发错误。

#!/bin/bash
instanceid=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)

healthcheck=$(curl -X GET http://localhost | grep "yes its working")

HEALTHCHECK=$?

if [ $HEALTHCHECK -eq 0 ] ; then
echo "Server registered to ELB"
usr/local/bin/aws elbv2 register-targets --target-group-arn arn:aws:elasticloadbalancing:ap-south-1:xxxxxxxx:targetgroup/my-targetgroup/xxxxxxxx --targets Id=$instanceid

exit 0

else
echo "healthcheck failed"
exit 0
fi
4

2 回答 2

0

谢谢@ceving,使用退出 0 的迭代。如果状态检查失败并退出,则重试 5 次。如果健康检查成功,它将注册到 LB。

#!/bin/bash

instanceid=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)

for itr in {1..5}
do
healthcheck=$(curl -X GET http://localhost | grep "yes its working")
healthcheck=$?
if [ "$HEALTHCHECK" -ne 0 ] ; then
echo "Healthcheck failed. sleeping for 5 sec"
sleep 5
echo 'Iteration' $itr
if [ $itr == 5 ]; then
echo 'Failed to register instance to ELB.'
fi
else
echo "Server registered to ELB"
usr/local/bin/aws elbv2 register-targets --target-group-arn arn:aws:elasticloadbalancing:ap-south-1:xxxxxxxx:targetgroup/my-targetgroup/xxxxxxxx --targets Id=$instanceid
exit 0
fi
done
于 2022-01-21T12:59:00.397 回答
0

尝试这样的事情:

#! /bin/bash

: ${TIMEOUT:=10}
: ${INTERVAL:=2}
: ${FAIL:=no}

healthcheck()
{
  case "$FAIL" in
    no) true;;
    *) false;;
  esac
}

(
  while true; do
    if healthcheck; then
      echo "Server registered to ELB"
      exit 0
    else
      echo "healthcheck failed"
    fi
    sleep "$INTERVAL"
  done
) & child=$!

kill_child() { kill -TERM "$child"; }

# See https://stackoverflow.com/a/11056286/402322
(
  sleep "$TIMEOUT" && {
    kill_child
    printf 'Timeout after %d seconds.\n' "$TIMEOUT"
  }
) 2>/dev/null & watcher=$!

kill_watcher () { pkill -TERM -P "$watcher"; }

trap kill_child INT
trap kill_watcher EXIT

wait "$child"

成功和超时的示例用法:

$ ./healthcheck.sh
Server registered to ELB
$ FAIL=yes ./healthcheck.sh
healthcheck failed
healthcheck failed
healthcheck failed
healthcheck failed
healthcheck failed
Timeout after 10 seconds.
于 2022-01-21T09:42:10.073 回答