본문 바로가기
개발(코딩) 경험 저장소/서버,유틸 설치 및 관리

systemctl 서비스 자동실행 등록 (Restart 옵션)

by 주니우스 2021. 3. 1.
반응형

Linux 에서 요즘엔 서비스 자동 실행 관리를 systemctl 로 관리한다. 

아마도 centos7 부터 였던것 같은데.... 아마도^^

 

 

일단 Linux에 tomcat 설치를 가정할 경우

/usr/lib/systemd/system/ 경로 아래에 tomcat9.service 이라는 파일을 생성해서

자동실행 스크립트를 만들어 사용했었는데~

스프링부트를 사용하여 프로젝트를 생성하다보니 이걸 자동실행 해야하는 경우가 자주생긴다.

이에 간단히 스크립트 작성 경험을 공유해본다.

여기서는 Restart 라는 옵션 위주로 알아보겠다.

 

 

 

[Unit]
Description=scheduler
After=syslog.target

[Service]
ExecStart=/opt/java/jdk-14.0.1/bin/java -jar /data/web-root/schedule/scheduler.jar


[Install]
WantedBy=multi-user.target

 

우선 일반 PC에 리눅스 설치하고 스프링부트로 만든 jar 파일을 자동 실행할때는 잘 수행 되었다.

그리고 이걸 상용서버(dell 서버)에 똑같이 적용을 했는데 안되는것이다.

특이한건 재부팅 하면 자동실행은 안되는데 

systemctl start scheduler.service  명령으로 실행하면 수행이 된다.

대충 로그를 보긴 했는데 잘 모르겠다. return code 가 어쩌고 하고 여튼 실패했고 네트웍 연결이 실패한듯 보였다....

 

차이를 생각해보다 일반 PC는 재부팅이 빠른데 dell서버는 부팅 과정이 상당히 길다.

정확히 뭘하는데 시간이 오래걸리는지는 모르겠지만 여튼 오래걸린다.

그래서 필요한 로딩이 끝나기 전에 스크립트가 실행되는건가 해서 

아래처럼 After 값에 network.target network-online.target 를 추가했다.

 

[Unit]
Description=scheduler
After=syslog.target network.target network-online.target

[Service]
ExecStart=/opt/java/jdk-14.0.1/bin/java -jar /data/web-root/schedule/scheduler.jar


[Install]
WantedBy=multi-user.target        

                                     

여기서 network.target 만 추가하려고 했는데

network.target 은 네트웍이 정상적으로 올라왔는지를 체크하지 않는다고 한다.

정상적으로 네트웍이 올라온 후 실행을 진행하려면 network-online.target 을 사용하라고 해서

위와같이 했는데 일단 재부팅시 실행스크립트는 실행되지 않았다.

 

그래서 이번 엔 Restart 옵션을 주었다.

 

 

[Unit]
Description=scheduler
After=syslog.target network.target network-online.target

Restart=on-failure
RestartSec=10s

[Service]
ExecStart=/opt/java/jdk-14.0.1/bin/java -jar /data/web-root/schedule/scheduler.jar


[Install]
WantedBy=multi-user.target    

 

 

Restart 옵션을 주고 나니 정상적으로 재부팅을 해도 잘 실행이 되더라...^^

Restart 옵션 값은 no|on-success|on-failure|on-watchdog|on-abort|always  가 올수있는데 

 

no 가 기본값.

on-failure 는 추천값이면서 정상적으로 종료되지 않았을 경우에는 재실행

always 는 정상 비정상 종료와 상관없이 무조건 재실행을 수행하는 옵션이다.

 

근데 always 가 무조건 실행인줄 알고 테스트를 한번 해봤는데 

systemctl stop scheduler.service  명령으로 중지하고 나서 아무리 기다려도 재실행이 안된다.

(참고로 RestartSec=10s 는 10초 뒤에 실행하라는 옵션)         

그래서 찾아본 결과 always 일지라도 systemctl stop 명령으로 중지한 데몬은 재실행 되지 않는단다.

kill 명령 또는 종료 스크립트로 종료했을 경우에는 10초 뒤 잘 실행이 된다.

항상 이런 스크립트 들은 정확히 알고 최적화 해서 사용하기가 쉽지 않다.      

 

 

 

반응형

댓글