배포 v1 - 3

LeeKyoungChang·2022년 5월 2일
0
post-thumbnail

메타코딩 유튜브를 참고하여 정리한 내용입니다.

 

📚 9. 배포v1 - cron 주기적 실행

프로젝트 배포 - 시간 설정 (여러가지)

  • 부하, 에러 (서버가 종료)
  • 서버가 종료됬다는 로그를 남길 때

다만, 지금까지는 자동 재시작이 되지 않았다. 직접 재시작 해야했다.

 

cron을 이용하면 자동 재시작 할 수 있다.

📖 A. cron 개념과 실습

crontab : 주기적 실행 멸령어

✔️ cron 예시

스크린샷 2022-04-29 오전 11 52 05

* * * * * ls -l 1>>cron.log (1은 생략 가능하다.)

  • 표준 출력을 cron.log로 보내라
  • 1은 생략 가능하다.
  • >> : ls -l 결과가 cron.log 밑 라인에 계속 추가가 된다.
  • 분(0 ~ 59), 시간(0~23), 일(1~31), 월(1~12), 요일(0~7)
  • 3시, 4시 동시 할시 : * 3, 4 * *
  • 3시 ~ 6시 : 3~6

 

실행 결과
스크린샷 2022-04-29 오전 11 54 55

 

📖 B. crontab을 이용하여 스크립트 등록하기

✔️ vi job.sh

스크린샷 2022-04-29 오후 1 41 01

ls -l >> /home/ubuntu/cron.log : 현재 ls -l 결과를 cron.log 끝 부분으로 옮겨라

 

✔️ vi myScript.sh : myScript 편집기

스크린샷 2022-04-29 오후 1 14 04
  • crontab -l 1>crontab_new : crontab 내용을 crontab_new 파일로 옮긴다.
  • echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new : crontab_new 파일에 echo의 내용을 추가한다. (끝 라인에 추가된다.)
  • crontab crontab_new : crontab에 crontab_new에 작성한 내용을 반영한다.
  • rm crontab_new : crontab_new 파일을 삭제한다.

 

📖 C. 스크립트로 cron 등록하기 정리

cron을 작동시키기 위해 crontab 설정해야 한다.

crontab -e : crontab 편집

스크립트 실행시 crontab에 자동 등록되게 하고 싶다.
(1) crontab -l 1>crontab_new

  • crontab -l : crontab -e 내용을 출력해준다.
  • crontab -l 결과를 crontab_new 파일에 옮긴다.

(2) echo "* * * * * /home/ubuntu/job.sh" 1>>crontab_new

  • crontab_new에 job.sh 실행 결과가 추가되었다. (매분 실행 결과가 마지막 줄에 추가된다.)

(3) crontab crontab_new

  • crontab_new 파일을 실행한다. (1), (2)이 실행된다.

(4) rm crontab_new

  • 실행 후, crontab_new파일을 삭제한다.

 

실행 결과
./myScript.sh 실행
스크린샷 2022-04-29 오후 1 18 59

  • myScript.sh 스크립트 실행으로 입력한 명령어들이 실행된다.

 

crontab -e 실행

스크린샷 2022-04-29 오후 1 15 29
  • "* * * * * /home/ubuntu/job.sh"가 crontab에 추가되었다.

 

1분이 지나고, cron.log 파일이 생성되었다.

스크린샷 2022-04-29 오후 1 25 32

 

cron.log 파일 실행해보면, 1분마다 ls -l 결과가 끝 부분에 추가된다.

스크린샷 2022-04-29 오후 1 40 09

 

📚 10. 배포v1 - cron으로 스프링 서버 재시작하기

사전에 서버가 실행된 상태여야 한다.
스크린샷 2022-05-02 오전 10 07 50

 

📖 A. 스프링 서버 직접 재시작하기

✔️ 서버 종료시키기

vi spring-stop.sh

  • 종료 스크립트 등록하기
스크린샷 2022-05-02 오전 10 10 02

 

스크린샷 2022-05-02 오전 10 11 43
  • 서버가 종료되었다.

 

✔️ 서버 실행하기

vi if문 명령어
스크린샷 2022-05-02 오전 10 17 15

 

vi spring-restart.sh

  • 시작 스크립트 실행하기
스크린샷 2022-05-02 오전 10 27 30

 

스크린샷 2022-05-02 오전 10 20 20
  • 현재는 종료된 상태이다.

 

✔️ 종료된 상태에서 재시작할 경우, 서버 시작되게 하기
vi spring-restart.sh

스크린샷 2022-05-02 오전 10 44 42
  • echo "스프링 재시작 - $date" 1>>/home/ubuntu/cron-restart/spring-restart.log
    • date : 시간을 넣기 위해 사용한다.
    • 재시작을 할 때마다, /home/ubuntu/cron-restart/spring-restart.log 에 시간이 저장된다.
  • nohup java -jar $SPRING_PATH 1>log.out 2>error.out &
    • 서버가 정상적으로 실행될 경우, log.out에 실행된 로그를 저장
    • 서버가 에러가 발생할 경우, error.out에 실행된 로그를 저장

 

spring-restart.sh 실행하기

스크린샷 2022-05-02 오전 10 46 35

./spring-restart.sh : 현재 스프링이 종료된 상태에서 실행했으므로 서버가 재시작된다.

  • spring-restart.log에 (재시작 할 때)시간이 저장된다.

 

📖 B. cron을 이용하여 스프링 서버 재시작하기

서버가 종료될 시, 자동 재시작해보자!

스크린샷 2022-05-02 오전 11 05 08

서버를 배포하기 위해서는 위와 같이 명령어를 다 입력해야 한다.
이제는 명령어들을 vi 편집기에 저장하여, 자동으로 실행해보자!

vi deploy.sh (chmod u+x deploy.sh : 사용자에게 실행 권한 주기)
스크린샷 2022-05-02 오전 11 20 41
스크린샷 2022-05-02 오전 11 24 01

이제 서버가 종료될 시, 자동 재시작이 될 것이다.

 

✔️ 서버를 종료 1분 지난 후, 서버가 자동으로 다시 실행된다.

./spring-stop.sh로 서버를 종료했다.
스크린샷 2022-05-02 오전 11 28 33

 

1분이 지나니, 서버가 자동 재실행된다.
스크린샷 2022-05-02 오전 11 29 20

스크린샷 2022-05-02 오전 11 34 55
  • 재시작하니, log에 실행 시간이 출력된다.

 

이제 deploy.sh을 실행하면 spring-restart.sh가 Clone에 등록된다.

스크린샷 2022-05-02 오전 11 33 12

 

📚 11. 배포v1 - 재배포 프로세스 이해하기

✔️ 재배포 하는 방법

1. 기존 서버를 중지 시켜야 한다.

spring-stop.sh → 실행권한을 준다.

- echo "Springboot Stop..."
- SPRING_PID=$(pgrep -f v1-0.0.1-SNAPSHOT.jar)
- echo $SPRING_PID
- kill -9 $SPRING_PID

2. aws-v1 폴더를 통째로 삭제해야한다.
- rm -r /home/ubuntu/aws-v1

3. git clone 다운
- git clone 주소

4. gradlew 실행 권한주기
cd /home/ubuntu/aws-v1
chmod u+x gradlew

5. 빌드하기
./gradlew build

6. jar를 실행하기
cd /home/ubuntu/aws-v1/build/libs
nohup java -jar /home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &

7. cron으로 자동 재시작

deploy.sh에서

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

➡️ 이 전체를 재배포 스크립트에 작성하여, 위 코드를 한 번에 실행할 수 있게 하면 좋다. (redeploy.sh)

하나의 배포 스크립트를 만들어두면 좋다.

  • 최초 : 최초 배포프로세스
  • 두 번째이상 : 재배포 프로세스

 

📚 12. 배포v1 - 재배포 하기

(1) 기존 서버를 중지 시키기
./spring-stop.sh

(2) aws-v1 폴더를 통째로 삭제
(3) git clone 다운로드

스크린샷 2022-05-02 오후 12 26 32

 

(4) gradlew 실행 권한주기

스크린샷 2022-05-02 오후 12 27 46

(5) 빌드하기
./gradlew build

스크린샷 2022-05-02 오후 12 28 41

(6) jar 실행하기

nohup java -jar /home/ubuntu/aws-v1/build/libs/v1-0.0.1-SNAPSHOT.jar 1>log.out 2>err.out &

스크린샷 2022-05-02 오후 12 31 23

(7) cron으로 자동 재시작

vi deploy.sh에 명령어 등록

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

 

ps -ef : 실행한 프로세스 번호 알아냄
kill 프로세스 번호 : 서버 종료

스크린샷 2022-05-02 오후 12 41 34

 

1분 지난 후

스크린샷 2022-05-02 오후 12 41 44

 

💡 참고
(2)~(7)번까지 서버가 멈춰있다. 즉, 재배포를 하게되면 서버는 멈춘다.

  • 배포하고 있을 때도, 서버를 멈추지 않게 하는 방법은? (나중에 알아본다.)
  • 재배포시에 ec2를 새로 생성해서 거기에 재배포를 하면 JDK 설치, apt update, crontab도 다시 등록해야 한다.
  • 배포가 잘됬으면 기존 서버를 종료시켜야 한다.

 

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글