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