어플리케이션 자동 실행을 위한 systemctl 서비스 등록 시 Trouble Shooting
EC2 서버에서 특정 스케줄로 어플리케이션을 실행하거나, 서버가 재기동될 때 어플리케이션을 자동으로 실행하려면 systemctl을 활용해 서비스를 등록하는 것이 효과적입니다.
이 과정은 간단히 말해 어플리케이션 실행용 shell script를 systemctl 서비스로 등록하여 서버 기동 시 어플리케이션이 자동으로 실행되도록 설정하는 것입니다.
하지만 서비스를 설정하다 보면 예상치 못한 문제에 직면할 수 있습니다. 오늘 제가 겪었던 세 가지 주요 이슈를 공유하며, 이를 예방하기 위한 팁을 소개하겠습니다.
1. nohup 및 백그라운드 명령어를 사용하지 마세요
systemctl 서비스는 자체적으로 백그라운드에서 동작합니다. 따라서 서비스를 등록할 때 호출되는 shell script에서 nohup이나 & 같은 명령어를 제거해야 합니다.
- 예시:
1
2
3
4
5
# 잘못된 코드
nohup java -jar app.jar &
# 올바른 코드
java -jar app.jar
- 이를 무시하면 프로세스가 비정상적으로 종료되거나 서비스 상태가 불안정해질 수 있습니다.
2. 어플리케이션 하나 당 하나의 서비스로 분리
하나의 shell script에서 여러 어플리케이션을 실행하도록 작성하는 경우가 종종 있습니다.
하지만 이를 systemctl 서비스로 등록하면 다음과 같은 오류가 발생할 가능성이 높습니다:
1
service start request repeated too quickly, refusing to start
- 원인:
어플리케이션 실행 간 종속성 문제가 있을 때, 특정 어플리케이션이 정상적으로 실행되지 않으면 systemctl이 재시도를 반복하다가 오류를 발생시킵니다.
- 해결책:
어플리케이션마다 독립적인 systemctl 서비스를 만들어 각자의 실행 흐름을 관리하세요.
A 어플리케이션 → B 어플리케이션 실행과 같은 종속성이 있는 경우, 서비스 간 의존성 설정(e.g., After=, Requires=)을 추가하면 됩니다.
3. 환경 변수 설정
로그인 시 자동으로 로드되는 환경 변수가 systemctl 서비스에서 인식되지 않을 수 있습니다.
따라서 환경 변수가 필요한 경우, 다음과 같은 방식으로 systemctl 서비스 파일에 환경 변수를 정의해야 합니다:
서비스 파일에 직접 설정
1 2 3 4
[Service] Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk" Environment="PATH=/usr/bin:/usr/local/bin" ExecStart=/usr/bin/java -jar /path/to/app.jar
환경 변수 파일로 관리 별도의 파일에 환경 변수를 정의하고 이를 systemctl 서비스에서 불러오는 방법도 있습니다:
1 2 3
[Service] EnvironmentFile=/path/to/envfile ExecStart=/usr/bin/java -jar /path/to/app.jar
정리
systemctl을 활용한 서비스 등록은 효율적이지만, 다음 사항을 유의하세요:
1. nohup 및 백그라운드 명령어 사용 금지
2. 어플리케이션 별로 독립적인 서비스 구성
3. 환경 변수는 서비스 파일에 명시적으로 정의
위 내용을 준수하면 안정적인 어플리케이션 실행 환경을 구축할 수 있습니다.
모두의 성공적인 서비스 설정을 응원합니다! 🚀