보통, 패키지를 깔면 자동으로 서비스 등록을 해 줍니다. 그런데, 경우에 따라서 바이너리로 설치하는 경우에는, 이를 직접 해 줘야 할 때도 있어요. 이 글에서는 ubuntu systemctl service 등록 방법을 알아보겠습니다.
서비스 프로그램 등록하기
사실, postgresql 이라던지, elastic search 등의 서비스를 생각하기 쉬워요. 이 글에서는 그냥, 무한 루프를 도는 프로그램을 띄우도록 하겠습니다.
이 service.py 파일은 /home/cho에 있어요. python3 /home/cho/service.py 명령어를 입력하면, 이 프로그램이 실행되어서 계속 돌아갑니다. 우리의 목표는 이를 서비스로 등록해서, 부팅이 될 때 마다 실행되게끔 하는 것이에요.
/usr/lib/systemd/system에 test.service 파일을 생성해 봅시다.
먼저, Description에 Test라고 입력하겠습니다. 다음에, Service에 ExecStart가 있는데요. 이 글에서는 이 옵션만 다룹니다. 두 번째로 killMode를 process로 한 것은, 서비스가 종료될 때 process만 종료되게 하기 위해 그리 적어두었습니다.
- ExecStart
- 서비스가 시작될 때 명령어를 의미합니다.
/home/cho/service.py가 우리가 실행시키려는 스크립트입니다. 고로, ExecStart에는 아래와 같이 적어주었습니다.
- python3 /home/cho/service.py
다음, Install 탭에 WantedBy에 multi-user.target이 적혀져 있습니다. 언제 이 서비스가 시작될 것인지를 나타내는데요. 추후에 자세히 다루겠습니다.
usr/lib/systemd/system에 test.service가 추가되었음을 볼 수 있습니다. 이제 등록을 해 보겠습니다.
systemctl enable test 명령어를 입력하면, 서비스가 활성화가 되는데요. 이 과정에서
- /etc/systemd/system/multi-user.target.wants/test.service에서
- /lib/systemd/system/test.service로 링크가 걸렸습니다.
이 폴더들에 대한 것도 추후에 다룰 일이 있을 겁니다. 여기에서는 그냥 이런 일이 일어나네. 정도만 보고 가도록 하겠습니다.
test를 enable 시키고, start를 시킨 다음에 systemctl status 명령어로 상태를 보니까, 돌아가고 있음을 볼 수 있어요. 여기까지 내용을 정리해 봅시다. 저는 새로운 test 서비스를 실행시키기 위해서 아래와 같이 처리하였습니다.
- 디렉토리 /usr/lib/systemd/system에 제가 정의한 test.service 파일을 추가했습니다.
- systemctl enable test로 서비스 test를 활성화 시켰습니다.
- systemctl start test로 test를 시작하였습니다. test는 데몬이 되었습니다.
여기까지 ubuntu systemctl service 등록 방법이였습니다. 이제, 다음으로 넘어갑시다.
서비스 정의 바꾸기
그런데 service.py가 service2.py로 바뀌었습니다. 어떻게 해야 할까요?
그러면 test.service 파일도 다시 작성해야 합니다.
다른 건 동일하고 ExecStart만 살짝 달라졌습니다. /home/cho에 있는 service.py 대신에 service2.py를 실행시키는 것으로요. 이제, 이 바뀐 파일을 기준으로 실행시키겠습니다. systemctl stop test로 test를 정지시킵니다.
daemon-reload 명령어를 사용하면, 시스템 정의 파일을 다시 로드할 수 있습니다. 다음에 test를 다시 시작하겠습니다.
CGroup을 보면, 5551 python3 … service2.py가 보입니다. 바뀐 정의인 service2.py가 실행되었음을 의미합니다.