글 작성자: 만렙개발자

1. systemd

Linux 환경에서 시스템의 서비스(혹은 데몬)을 관리하기 위해 systemd를 사용합니다.

systemd는 sytem과 user 서비스를 모두 지원합니다.

  • 시스템 서비스: 시스템의 고유 systemd 인스턴스 안에서 실행하며, 전체 시스템과 모든 유저를 위한 기능을 제공합니다.
  • 유저 서비스: 특정한 유저에게 묶여있는 분리된 systemd 인스턴스에서 실행합니다.

 

2. python 코드를 이용한 systemd service 만들기

python 코드를 이용해서 systemd service를 만드는 것은 매우 간단합니다.

 

~/.config/systemd/user/ 경로에 (여기에 두지 않으면 서비스를 못찾습니다ㅠ)

demo.service 파일을 만들고 아래와 같은 내용을 담습니다.

(python 파일의 경로를 여러분에게 맞게 설정해야합니다. python 파일은 서비스 파일과 같은 곳에 위치할 필요가 없습니다.)

[Unit]
Description=Python Demo Service

[Service]
# Command to execute when the service is started
ExecStart=/usr/bin/python path/to/your/python_demo_service.py

그리고 다음과 같은 systemctl 명령어로 (유저) 서비스를 실행합니다

$ systemctl --user start demo

일단 실행하면 아무런 메세지도 안뜹니다.

(서비스 파일을 못 찾을 경우에는 에러 메세지가 출력됩니다. 경로를 확인하세요!)

 

다음 명령어로 status를 확인해봅시다.

$ systemctl --user start python_demo_service

성공적으로 서비스가 가동된 경우, 다음과 같이 active로 나타나며, 실패했을 경우 그 아래와 같이 Failed가 뜹니다.

 

 

만약에 service 파일을 수정할 경우 다음과 같은 명령어를 실행해야합니다.

(버전에 따라 친절하에 Warning이 표시되기도 합니다.)

$ systemctl --user daemon-reload

다음 명령어로 시스템을 멈춥니다. (종료)

$ systemctl --user stop python_demo_service

status를 확인해보면 다음과 같이 inactive (비활성화)가 되어있는 것을 확인하실 수 있습니다.

 

 

3. 실패 후에 서비스를 자동적으로 재시작하기

서비스 파일을 간단히 수정하여 컴퓨터를 껐다 키면 자동으로 서비스를 실행하도록 할 수 있습니다.

Restart=on-failure 옵션을 추가하면 됩니다.

 

[Service]
...
Restart=on-failure

테스트를 해보려면 sigkill로 서비스를 죽이고, journalctl로 실행 기록을 살펴볼 수 있습니다.

journalctl --user-unit python_demo_service

 

 

references

[1] https://www.freedesktop.org/wiki/Software/systemd/

[2] https://github.com/torfsen/python-systemd-tutorial