0.개요
이전에는 스크립트 파일로 불필요한 명령어를 치는 과정을 하나의 스크립트 파일로 압축해서 실행하도록 했습니다. 하지만 아직은 스크립트 파일을 일일히 수동으로 실행해주어야합니다. 하지만 웹사이트는 어떠한 문제로 인해서 프로세스가 종료될 수 도 있습니다. 이를 감지해서 알아서 자동으로 켜주게 하는 것이 좋을 것입니다. cron이라는 명령어를 통해서 주기적으로 프로세스를 감지,실행하도록 해보겠습니다.
1. cron명령어
cron은 주기적으로 어떤 작업을 실행할 수 있는 명령어입니다.
crontab -e
* * * * * ls -l >>cron.log
crontab -e를 통해서 crontab을 생성해줍니다. 이후에 어떤 에디터로 작성할지를 묻는데, 저는 vi에디터가 편해서 2번을 선택하겠습니다.
안에는 위와같은 텍스트를 적어줍니다. * 은 처음부터 분,시간,일,월,요일을 의미합니다. ">"와 ">>"의 차이는 한개일 때는 결과값을 넘기고 덮어씌웁니다. 두개일 때는 지속적으로 추가합니다.
정리하자면, 해당 명령어는 매분 "ls -l"이라는 명령어를 실행해서 cron.log라는 파일을 생성해서 안에 지속적으로 추가하라는 의미입니다. 해당 명령어로 crontab이 잘돌아가는지 실험해 보도록합니다.
그럼 루트경로에가서 확인해보면 cron.log라는 파일이 생성된 것을 확인해볼 수 있습니다. cat으로 확인해보면 "ls-l" 이라는 명령어가 매분마다 실행되고 있음을 확인할 수 있습니다.
2. cron 스크립트화
이런 cron 명령어 또한 스크립트화 해주도록 합니다.
vi myscript.sh
crontab -l 1>crontab_new
스크립트 파일을 하나 만들고, 안에 위의 명령어를 적어줍니다.
crontab의 내용을 그대로 가져와서 crontab_new라는 파일에 덮어씌워준다는 의미입니다.
./myscript.sh
cat crontab_new
실행하고 확인해보면 crontab의 내용이 그대로 담겨진 crontab_new라는 파일이 생성되었습니다.
crontab -l 1>crontab_new
echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new
crontab crontab_new
방금 만든 스크립트 파일의 내용을 위처럼 추가해줍니다.
매분 /home/ubuntu/job.sh 라는 파일을 실행해서 contab_new에 넣고, 이후 crontab_new의 내용을 crontab명령어로 실행하도록 합니다.
vi job.sh
ls -l>/home/ubuntu/cron.log
job.sh파일에서는 "ls -l"이라는 명령어를 cron.log에 담는 작업을 하도록 해줍니다.
그럼 crontab -e를 통해서 crontab을 확인해보면 crontab_new에서 Job.sh를 실행하라는 명령이 반영되어 있는 것을 확인해볼 수 있습니다. 이제 crontab에서는 주기적으로 job.sh안에 있는 ls -l를 cron.log에 저장하도록 할 겁니다.
cron.log을 살펴보면 분마다 "ls -l"을 실행해서 저장하고 있는 것을 확인해볼 수 있습니다.
정리
정리하자면,
- crontab -e를 통해 crontab이라는 주기적으로 명령들이 실행되는 공간을 만든다.
- crontab_new라는 파일을 만들어서 crontab의 내용을 가져와서 복사합니다.
- crontab_new에 원하는 명령어나 스크립트 실행하는 명령어를 추가한 다음 crontab_new에 내용이 crontab에 적용되도록 합니다.
- crontab_new에 추가된 내용이 crontab에 적용되면서 주기적으로 해당 명령어들이 실행됩니다.
3. cron을 이용해 스프링 서버를 재시작하기
mkdir cron-restart
cd cron-restart
vi spring_stop.sh
"cron-restart" 라는 디렉토리를 만들어서 프로젝트를 종료,시작하는 스크립트 파일을 모아두겠습니다. 해당 디렉토리로 들어가서 "spring_stop"이라는 스크립트 파일을 만들어줍니다.
echo "SPRINGBOOT STOP..."
SPRING_PID=$(pgrep -f v1.0.0.1-SNAPSHOT.jar)
kill -9 $SPRING_PID
이전에 했던 내용 그대로 우리가 실행하는 포르젝트의 jar파일을 종료하도록 하는 스크립트를 작성해줍니다.
vi spring-restart.sh
SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
SPRING_PATH="/home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar"
echo $SPRING_PID
echo $SPRING_PATH
if [ -z "$SPRING_PID" ]; then
echo "스프링 종료된 상태..."
echo "스프링 재시작 - $(date)" 1>>/home/ubuntu/cron-restart/spring-restart.log
nohup java -jar $SPRING_PATH 1>log.out 2>err.out &
else
echo "스프링이 시작된 상태..."
fi
이번에는 "spring-restart"라는 프로젝트를 재실행하는 스크립트도 짜두도록 합니다.
해당 스크립트는 프로젝트의 jar파일의 PID를 추적해서, -z 옵션으로 해당 PID의 길이가 0이면 참이라고 판단하게 합니다.
현재 프로젝트가 실행중이라면, PID가 존재한다.> PID가 존재하면 길이가 0일 수가 없다.
반대로, PID가 존재하지 않는다 > 길이가 0이다 > 현재 프로세스가 실행되고 있지 않다. 라는걸 의미합니다. 해당 조건으로 if문을 통해서 현재 프로젝트가 실행중인지 아닌지 판단할 수 있습니다.
이러한 판단을 통해서 현재 프로세스가 종료된 상태라면, date, 즉 현재시간을 함께 담아서 언제 프로젝트가 재실행 되었는지를 확인할 수 있도록 spring-restart.log라는 로그에 담도록 하고, nohup명령어로 다시 프로젝트를 실행하도록 합니다.
이렇게 하면 모종의 이유로 종료된 프로젝트를 감지해서 알아서 재시작 해주는 로직이 완성되었습니다.
vi deploy.sh
# 2. 스프링 서버 종료시 재시작
echo "crontab 등록 - spring restart..."
crontab -l > crontab_new
echo "* * * * * /home/ubuntu/cron-restart/spring-restart.sh" 1>>crontab_new
crontab crontab_new
rm crontab_new
deploy.sh라는 스크립트 파일을 만들어서 해당 내용을 넣어줍니다. crontab_new를 만들어서, 프로젝트 재실행 동작을 추가하고, crontab에 적용하고, crontab_new파일을 필요 없어졌으니 삭제해줍니다.
deploy.sh에는 자동으로 github에서 프로젝트를 가져와서...JDK깔고....빌드해서..배포하는 과정도 추가해야 하지만 일단은 재실행 동작만 테스트 해보겠습니다.
sudo chmod u+x spring-restart.sh
sudo chmod u+x deploy.sh
./deploy.sh
해당 스크립트를 실행시킵니다.
crontab -e 로 확인해보면 crontab에 재실행 프로세스가 추가되어 있습니다. 이제 프로젝트가 종료된 것을 매분 감지해서 자동으로 실행을 해줄 것입니다.
위처럼 프로젝트가 종료되어 있는 상태에서 1분이 지나면, spring-restart.log가 생성되고, 8080포트가 자동으로 실행됩니다.
재시작 로그 또한 확인할 수 있습니다.
4. 개선해야할 점
지금까지 EC2 서버를 통해서 스크립트로 베이직하게 배포하는 방법을 해보았습니다. 하지만 역시 개선해야할 점이 많습니다.
- 프로젝트가 업데이트 되어서 재배포를 해야할 때는 어떻게 할 것인가?
- 재배포 할 시 서버가 꺼져있으면 안되는데 이것을 어떻게 해결할 것인가?
- 테스트를 안하고 배포중인데, 테스트를 어떻게 처리할 것인가?
- 사용자가 늘어나서 서버가 불안정해지면 어떻게할 것인가?
- github에 코드를 새로 push하면 이를 감지해서 자동으로 재배포를 할 수 있도록 할 수는 없을까?
앞으로 이런점들을 고려해서 배포하는 방법들을 알아보겠습니다.
'Project > AWS 및 배포' 카테고리의 다른 글
AWS - AWS 꼭 확인하자! 요금폭탄 피하기 (0) | 2024.02.03 |
---|---|
AWS - 3-2. 베이직 하게 배포해보기 - 타임존 변경, 스크립트 작성 (1) | 2024.01.31 |
AWS - 3-1. 베이직 하게 배포해보기 - 백그라운드 실행, 로그파일 분리 (0) | 2024.01.31 |
AWS - 3. 베이직 하게 배포해보기 - EC2 서버에 프로젝트 배포하기 (1) | 2024.01.31 |
AWS - 2. 키페어와 RSA (0) | 2024.01.30 |