Оформление службы в systemd из файла python
Для того чтобы служба полноценно работала, в файле python необходимо предусмотреть:
- Блокировку запуска копии скрипта
- Создание pid файла с номером процесса
Теоретически это возможно возложить и на плечи systemd, но «классически» делать это самому.
Пример создания pid файла:
1 2 3 4 5 6 7 8 |
import os # выясним id процесса т создадим pid файл try: pid=os.getpid() with open(f"/var/run/ocpp_{sys.argv[1]}.pid", "w") as file: file.write(str(pid)) except Exception as e: functions.logapi.error(f"Не удалось создать PID файл {e}"); |
Пример блокировки запуска копии:
1 2 3 4 5 6 7 8 9 10 11 |
from filelock import FileLock,Timeout lock = FileLock(f"{sys.argv[1]}.lock",0) try: lock.acquire() except Timeout: functions.logapi.error(f"инстанс {sys.argv[1]} уже запущен на сервере"); exit(-1); with lock: functions.logapi.debug(f"включена блокировка запусков других инстансов"); |
Пример файла настройки службы в этом случае (xx.service):
1 2 3 4 5 6 7 8 9 10 |
[Unit] Description=ocpp1 [Service] ExecStart=python3 /home/user/цувцув/цувцу.py ocpp1 PIDFile=/var/run/ocpp_ocpp1.pid [Install] WantedBy=multi-user.target |
В Ubuntu его необходимо положить в /etc/systemd/system и перезапустить службу:
1 |
sudo systemctl daemon-reload |