Wednesday, November 30, 2022

Bash script monitor web site service ไม่ตอบ status 200 ให้ restart web service อัตโนมัติ

  • ประเด็นมีอยู่ว่า ระบบ web ใช้ Linux + Apache2 + PHP 7 มี client เข้าไปใช้างานเยอะ บางช่วงเวลา
  • ทำให้ server 443 ไม่ตอบสนองบางครั้ง คือ  freeze ไปเลยว่างั้น กว่าจะกลับมาทำงานปกติก็ใช้เวลานาน
  • แก้ไขเบื้องต้นคือ remote เข้าไป restart apache
  • เลยหาวิธีเขียน bash script monitor server response 200 เป็นจำนวนครั้งตามที่เราตั้งค่า ถ้าไม่ตอบ 200 ทุกครั้งก็ restart เลย
  • พร้อมเก็บ log file  และส่ง line notify พร้อม
  • ตัวอย่างนี้ เช็ค 3 ครั้งเว้น 3 วินาที ถ้าไม่ตอบ status 200 ทุกครั้ง ให้ restart apache เลย

Solved

#!/bin/bash


now=$(date)

url='https://your_site'


### admin line token

token="iFBqHnx34sHla9rAQ7Qxxxxxxxxxxxxxxxxxxxxx

message="$url >>> non response >>> /etc/init.d/apache2 restart >>> $now"


i=0

j=0


## 0,1,2

until [ $i -gt 2

do

  echo i: $i

  ((i=i+1))

  sleep 3s


  status=$(curl --head --location --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null ${url})

  [[ $status == 500 ]] || [[ $status == 000 ]] && ((j=j+1)) # do start/restart logic

done


echo "J: $j"


if (( $j == 3 ))

 then

    echo "J == 3"

    echo "restart ${url}: $now" >> /path/log_service_freezed.log

    curl -X POST -H "Authorization: Bearer $token" -F "message=$message" https://notify-api.line.me/api/notify

    /etc/init.d/apache2 restart

 else

    echo "J != 3"

 fi 

Ref

  • https://linuxize.com/post/bash-increment-decrement-variable/
  • https://www.cyberciti.biz/faq/linux-unix-sleep-bash-scripting/
  • https://stackoverflow.com/questions/13086109/check-if-bash-variable-equals-0

No comments:

Post a Comment