사내에서 나름... MSA환경(?)을 구축하고 있다. 문제는 도입 과도기라 한번 서버를 띄우려고 하면 터미널을 여러개를 켜서 각 서버를 순서대로 띄워줘야 한다는 것이다. 너무너무 귀찮아서 집에서 스크립트를 작성해보기로 했다.
가장 주의해야 할 점은 현 상황에서는 config_server가 띄워진 이후에 나머지 서비스들을 구동 시켜야 한다는 점이었다.
참고로 아래 코드들은 순전히 개인적으로 개발을 편리하게 하기 위한 목적으로 간단히 만든 스크립트이니 부족한 점이 많을 수 있다는 점 참고 부탁드립니다.
터미널 탭 생성
#!/bin/bash
targetPath=$PWD
services=("config_server" "discovery_server" "service_0" "service_a" "gateway_server")
for ((i = 0; i < ${#services[@]}; i++)); do
echo "${services[i]}"
osascript -e "tell application \"iTerm\" to activate
tell application \"System Events\" to tell process \"iTerm\"
keystroke \"cd $targetPath/${services[i]}\"
key code 36
end tell"
if [ $i -lt $((${#services[@]} - 1)) ]; then
osascript -e "tell application \"iTerm\" to activate
tell application \"System Events\" to tell process \"iTerm\"
keystroke \"t\" using command down
end tell"
fi
//...
먼저 내가 띄우고자 하는 service들(폴더명과 일치한다.)을 services라는 변수에 담아주고, 해당 serviecs를 for문을 돌면서
osascript를 이용하여 해당 위치로 이동하고 아직 services가 남아있다면 command + T를 입력해서 새로운 터미널 탭을 생성하게 했다.
서비스 헬스 체크
#### 필요서비스 구동여부 체크
check_services_running() {
local config_server_port=9999
# Check if config_server is running
if nc -z localhost $config_server_port 2>/dev/null; then
echo "config_server is running on port $config_server_port."
else
echo "config_server is not running on port $config_server_port."
return 1
fi
}
//...
if [ "${services[i]}" == "service_0" ]; then
while ! check_services_running; do
sleep 5
done
fi
//...
먼저 config_server가 잘 띄워져 있는지 체크하는 함수를 만들었다.
어차피 config_server만 체크할 것이니 굳이 인자를 받지 않고 포트 번호는 내부에 하드 코딩했다.
1) nc -z
linux의 nc 커맨드를 이용해서 서버가 잘 띄워져 있는지 체크했다.
참고로 -z 옵션은 아무 데이터도 보내지 않고 포트 오픈여부만 체크하고, 커넥션을 바로 끊어주게 하는 옵션이다.(참고링크)
2) 2>dev/null
2>/dev/null 은 stderror를 /dev/null로 redirect해서 nc 커맨드로 인해 생길 수 있는 에러 메시지들을 모두 막을 수 있는 커맨드이다.
주의 할 점은 shell에서 if문의 작동방식이다.
만약 자바 스크립트에서라면 if문은 아래처럼 작동할 것이다.
if(0){
}else{
//always comes in this else clause
}
shell에서는 '0' 이 정상적인 exit코드 이고, '0'이 아닌 다른 숫자들은 모두 error exit코드(non-zero exit code)로 처리된다.
이런 방식에 의해 '0'은 true로 non-zero exit code는 false로 처리되게 된다.
위의 코드에서 else문에서 return 1을 해준 것도 같은 이유이다.
이제 최종적으로 서버가 떠 있을 때까지 while문을 돌며 기다리다가, consig_server가 정상적으로 뜬 이후에 나머지 서버들을 띄우게 할 수 있었다.
'Linux' 카테고리의 다른 글
script파일 실행권한 부여 permission denied: ./run.sh (0) | 2023.02.08 |
---|---|
[Linux] Linux tar, gz 압축 및 해제 (exclude 사용법) (1) | 2022.09.30 |
리눅스 서버에서 sudo 없이 docker 실행하기 (0) | 2022.05.31 |
[Linux] 계정 생성, 확인, 삭제 (0) | 2022.05.27 |