Оформление службы в systemd из файла python
Для того чтобы служба полноценно работала, в файле python необходимо предусмотреть:
- Блокировку запуска копии скрипта
- Создание pid файла с номером процесса
Теоретически это возможно возложить и на плечи systemd, но «классически» делать это самому.
Пример создания pid файла:
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}");
Пример блокировки запуска копии:
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):
[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 и перезапустить службу:
sudo systemctl daemon-reload