[ 작업 환경 ]
Centos 7.8
Python 3.6
Flask 1.1
[ 문제 상황 ]
필자의 경우, 서버에서 가동중인 Flask 서버가 간혹 비정상화되어 이 문제에 대한 임시 조치로 Flask 서버를 모니터링하는 shell script를 작성해 동시에 가동하였습니다.
그러나 Falsk 서버에 행이 발생해 API가 비정상인데도 불구하고 약 5분 정도 후에나 Flask 서버가 재가동되는 것을 확인했습니다.
[ 문제 원인 ]
필자가 작성한 Shell Script는 아래와 유사합니다.
target="https://test.growingsaja.co.kr"
check=`curl -s $target`
curl 명령어를 사용하여 도메인으로 요청을 보내 Health Check를 확인하는 형태라고 보시면 됩니다.
기본적으로 curl 커맨드는 Response가 돌아올 때 까지 기다리는데, DEFAULT_CONNECT_TIMEOUT 은 5분으로 설정되어있습니다.
define DEFAULT_CONNECT_TIMEOUT 300000 # milliseconds == five minutes
이 부분을 모르면 이해할 수 없는 현상이지만, 기존 timeout 시간이 5분이기 때문에 그동안 약 5분 정도 후에나 Flask 서버가 재가동되었음을 알 수 있습니다.
(출처:github.com/curl/curl/blob/master/lib/connect.h#L43)
즉, Request를 했으나 Response로 비정상이다라고 알려준다면 바로 재가동을 하지만, 서버에 행이 걸린 경우 Response가 오지 않기 때문에 계속 해당 script process가 Response를 기다리고, 현재 설정상 5분으로 되어있기 때문에 약 5분 후 timeout으로 curl 요청이 stop되면서 그제서야 서버를 재가동하는 것입니다.
[ 문제 해결 ]
여러가지 해결 방법이 있겠지만, 위와 같이 행 발생으로 인한 서버 비정상화 case를 대비해 connect-timeout 시간을 curl command 옵션으로 직접 요쳥해주었습니다.
target="https://test.growingsaja.co.kr"
check=`curl -s $target --connect-timeout 10`
위와 같이 작성할 경우, timeout 시간은 10초이고, 10초 이내에 response가 오지 않으면 관리자가 알 수 있도록 작성해주었습니다.
이외에 --retry 옵션이나 --max-time 옵션을 활용하는 것도 방법이 될 수 있겠습니다.
'Development > Shell script' 카테고리의 다른 글
[shell script] datetime 현재 날짜, 시간 깔끔하게 출력하기 (0) | 2020.08.08 |
---|---|
[Shell Script] 데몬 start 및 stop 스크립트 작성 예시 (0) | 2020.01.08 |
[Shell Script] 현재 시간 정보 가져오기 (0) | 2020.01.06 |
[Shell Script] 스토리지 데이터 디스크 기본세팅 자동화 스크립트 (0) | 2019.11.10 |
[Shell Script] 유용한 Linux 명령어 활용 예시 : -F와 NR 활용 (0) | 2019.08.08 |