파이썬으로 systemd 서비스(데몬)를 작성하기위한 튜토리얼
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
'✏️ 수동로깅 > dev_log' 카테고리의 다른 글
댓글
이 글 공유하기
다른 글
-
jupyter notebook/lab colab에서 지저분한 tqdm을 깔끔하게 출력하기!
jupyter notebook/lab colab에서 지저분한 tqdm을 깔끔하게 출력하기!
2020.07.24 -
AttributeError: 'KNeighborsClassifier' object has no attribute 'n_samples_fit_'
AttributeError: 'KNeighborsClassifier' object has no attribute 'n_samples_fit_'
2020.07.07 -
Kafka Consumer to insert mongoDB in python
Kafka Consumer to insert mongoDB in python
2020.06.16 -
[opencv] ImportError: libSM.so.6: cannot open shared object file: No such file or directory
[opencv] ImportError: libSM.so.6: cannot open shared object file: No such file or directory
2020.03.15