github Actions를 사용하여 CI/CD 파이프라인을 구축하던 중 에러가 발생하였다.
오류 상황
process exited with status 137 from signal kill
- SIGKILL 시그널로 프로세스가 강제 종료됨
- 보통 이런 경우는 메모리 부족(OOM, Out Of Memory) 또는 GitHub Actions에서 SSH로 실행한 프로세스가 바로 종료될 때 발생
구글링을 해보니 메모리 부족이 가장 흔한 경우라 한다.
메모리 확인
# SSH에서
free -h
그래서 급하게 EC2의 서버 용량을 t3.micro(1GB)에서 c3.small(2GB)로 늘렸으나 여전히 같음
SSH로 접속한 EC2에서 직접 실행했을 때 정상 실행되었음 → 이 경우는 메모리 부족이 문제가 아님
오류 점검
나와 같은 오류인지 점검해보자.
- github Actions 실행이 끝까지 모두 완료 되는가? --- Yes
- github Actions 실행 모두 완료 후 1초만에 프로세스가 종료되는가? --- Yes
- SSH로 직접 실행할 경우 정상 실행되는가? --- Yes
위 3가지가 모두 해당된다면 나와 같은 상황이다.
yml 코드를 수정해주자.
GitHub Actions YML 수정
기존 코드
# 5. EC2 서버에서 실행 (기존 프로세스 종료 후 새로 실행)
- name: Restart app on EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# 기존 실행 중인 프로세스 종료
pids=$(pgrep -f "exam-0.0.1-SNAPSHOT.jar")
if [ -n "$pids" ]; then
kill -9 $pids
fi
# 새로 실행 (백그라운드, 로그 저장)
nohup java -jar /home/ec2-user/exam-0.0.1-SNAPSHOT.jar > /home/ec2-user/app.log 2>&1 &
- actions 컨테이너 내부에서 .jar를 재실행하는 방식
- GitHub Actions에서 ssh-action 단계가 끝나면서 내부 컨테이너가 종료됨 → 그 컨테이너 안에서 실행된 자식 프로세스(java -jar)도 같이 kill됨 → exit 137
- 즉, 오류 원인은 Actions와 프로세스를 완전히 분리하지 못해서 프로세스 강제종료 발생
수정된 코드
- .jar 실행 부분을 스크립트로 작성하여, 그것을 실행하는 명령 작성
- github Actions와 프로세스를 완전히 분리한다.
# 5. EC2 서버에서 실행 (기존 프로세스 종료 후 새로 setsid+nohup 실행)
- name: Restart app on EC2
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }}
script: |
# 기존 실행 중인 jar 종료
pids=$(pgrep -f "exam-0.0.1-SNAPSHOT.jar")
if [ -n "$pids" ]; then
kill -9 $pids
fi
# 새로 실행 (setsid + nohup, 백그라운드, 로그 저장)
setsid nohup java -Xms128m -Xmx512m -jar /home/ec2-user/exam-0.0.1-SNAPSHOT.jar \
> /home/ec2-user/app.log 2>&1 < /dev/null &
실행 스크립트 작성
SSH로 EC2 접속 후 실행 파일 deploy.sh 생성
vi deploy.sh
i 누르고 deploy.sh 작성
#!/bin/bash
# 기존 실행 중인 jar 종료
pids=$(pgrep -f "exam-0.0.1-SNAPSHOT.jar")
if [ -n "$pids" ]; then
kill -9 $pids
fi
# 새로 실행 (setsid + nohup, 백그라운드, 로그 저장)
setsid nohup java -Xms128m -Xmx512m -jar /home/ec2-user/exam-0.0.1-SNAPSHOT.jar \
> /home/ec2-user/app.log 2>&1 < /dev/null &
이후 ESC → :wq 입력 → Enter로 저장
파일 실행 권한 부여
chmod +x /home/ec2-user/deploy.sh
이렇게 해주고 나니 정상 실행된 모습을 볼 수 있다. 👍🏻
'서버&인프라 > Cloud' 카테고리의 다른 글
CI/CD 파이프라인 구축으로 배포 자동화하기 - EC2와 Github Actions 연동 (0) | 2025.09.19 |
---|---|
AWS RDS가 PuTTY에선 연결되지만 workbench 연결 안 되는 오류 (0) | 2025.09.16 |
AWS EC2에 Spring boot+React 프로젝트 배포하기 (0) | 2025.09.16 |
Google Cloud Run으로 배포한 서비스를 가비아 도메인과 연결하기 (0) | 2025.01.10 |
docker 이미지를 Google Cloud Run에 배포하기 (0) | 2025.01.09 |