본문 바로가기

Programming/Linux

Linux 환경에서 Service 등록하기

반응형

안녕하세요 남산돈가스입니다.

오늘은 리눅스 서버에서 어플리케이션을 운영할 때, 이 어플리케이션들을 Service로 등록하여 관리하는 방법을 소개드리려고 합니다.

우선 왜 Service 등록하여 사용하려고 할까요?

결론부터 말씀드리자면 귀찮기 때문입니다...ㅎ

어플리케이션의 start, stop, restart 스크립트를 작성했다고 하더라도, 결론적으론 alias에 등록하여 사용하시거나, 해당 스크립트가 있는 디렉토리로 이동하셔서 실행명령을 통하여 어플리케이션의 상태를 관리하고 있습니다. 하지만 Service로 등록하여 사용하게 되면, 어떤 디렉토리에서든지 실행이 가능하며, 아무래도 익숙한 systemctl 이나 service 명령어들을 이용하여 어플리케이션을 관리할 수 있게됩니다.

또 한가지 이유는, 서버의 장애 또는 부하분산으로 인한 서버 Booting이 발생할 경우 자동으로 실행되도록 Service를 등록해줄 수 있기 때문입니다.

그럼 이제 Service를 등록하는 예시를 보시겠습니다.

먼저 예제로 실행시켜볼 스크립트 파일을 작성하겠습니다.

#!/bin/bash

echo -e "This is Test"

단순하게 "This is Test" 라는 텍스트를 출력하는 test.sh을 생성하고 실행권한은 755로 변경합니다.

[platform@ip-10-0-11-9 ~]$ sudo chmod 755 test.sh
[platform@ip-10-0-11-9 ~]$ ls -al test.sh
-rwxr-xr-x 1 platform platform 36  5월  8 15:30 test.sh

이제 service를 등록하기 위하여 systemd 디렉토리로 이동합니다.

/etc/systemd/system/your.service

위 경로에 your.service를 새로 등록 할 서비스.service라는 파일을 작성하면 됩니다.

저는 test.service라는 service 파일을 생성하고 위와 같이 입력했습니다.

  • Description : 개요입니다. service에 대한 간략한 설명을 입력합니다.
  • ExecStart : 실행 할 어플리케이션의 실행파일 및 명령어를 입력합니다.
  • WorkingDirectory : ExecStart 이 구동되는 디렉토리 환경입니다.
  • WantedBy : systemctl enable 명령어로 유닛을 등록할때 등록에 필요한 유닛을 지정합니다.

이제 생성한 서비스를 등록하고 실행해보겠습니다.

[platform@ip-10-0-11-9 system]$ sudo systemctl daemon-reload   // systemctl 데몬을 재구동하여 생성한 service를 등록
[platform@ip-10-0-11-9 system]$ sudo systemctl enable test     // 시스템 부팅 시 test 서비스를 실행하도록 설정
Created symlink from /etc/systemd/system/multi-user.target.wants/test.service to /etc/systemd/system/test.service.
[platform@ip-10-0-11-9 system]$ sudo systemctl start test      // test 서비스를 실행
[platform@ip-10-0-11-9 system]$ sudo systemctl status test     // test 서비스의 상태를 조회
● test.service - Service Register Test
   Loaded: loaded (/etc/systemd/system/test.service; enabled; vendor preset: disabled)
   Active: inactive (dead) since 금 2020-05-08 15:39:36 KST; 7s ago
  Process: 26086 ExecStart=/home/platform/test.sh (code=exited, status=0/SUCCESS)
 Main PID: 26086 (code=exited, status=0/SUCCESS)

 5월 08 15:39:36 ip-10-0-11-9.ap-northeast-2.compute.internal systemd[1]: Started Service Register Test.
 5월 08 15:39:36 ip-10-0-11-9.ap-northeast-2.compute.internal systemd[1]: Starting Service Register Test...
 5월 08 15:39:36 ip-10-0-11-9.ap-northeast-2.compute.internal test.sh[26086]: This is Test        // test.sh 파일이 실행 된 결과

test.sh의 내용이 프로세스를 실행시키는 스크립트가 아니여서 service의 상태는 "This is Test"라는 텍스트를 출력한 뒤 역할이 끝났기 때문에 inactive한 상태가 표시되고 있습니다. 

이제 위 예제처럼, 어떠한 어플리케이션을 서비스로 등록하여 systemctl(service) start, stop, restart, status 등의 명령어로 상태를 관리할 수 있습니다.

감사합니다.