Запуск Python скрипта в виде службы через systemctl/systemd

| Linux

Есть несколько способов запуска вашей программы в качестве фоновой службы в Linux, таких как crontab, .bashrc и т. д., но сегодня будет разговор о systemd. Изначально я искал способ запустить свой скрипт на Python в качестве фоновой службы, поэтому даже если сервер по какой-то причине перезагрузится, мой скрипт все равно должен работать в фоновом режиме, после небольшого ресерча и я обнаружил, что systemd позволяет мне это сделать. Давайте начнем.

Настройки далее будут производиться на машине с Ubuntu 20.04.

Почти все версии Linux поставляются с systemd из коробки, но если у вас его нет, вы можете просто запустить следующую команду:

sudo apt install -y systemd

Примечание. Флаг -y означает быструю установку пакетов и зависимостей.

Чтобы проверить, какая версия systemd у вас установлена, просто выполните команду:

systemd --version

Создайте файл python с любым именем. Я назову свой скрипт именем test.py.

sudo nano test.py
import time
from datetime import datetime
while True:
    with open("timestamp.txt", "a") as f:
        f.write("Текущая временная метка: " + str(datetime.now()))
        f.close()
    time.sleep(10)

Приведенный выше скрипт будет записывать текущую метку времени в файл каждые 10 секунд. Теперь напишем сервис.

sudo nano /etc/systemd/system/test.service

(имя службы, которая тестируется в этом случае)

[Unit]
Description=My test service
After=multi-user.target

[Service]
User=deepak
Group=admin
Type=simple
Restart=always
ExecStart=/usr/bin/python3 /home/<username>/test.py

[Install]
WantedBy=multi-user.target

Замените имя пользователя в вашей ОС, где написано <username>. Флаг ExecStart принимает команду, которую вы хотите запустить. Таким образом, в основном первый аргумент — это путь к python (в моем случае это python3), а второй аргумент — это путь к скрипту, который необходимо выполнить. Флаг перезапуска всегда установлен, потому что я хочу перезапустить свою службу, если сервер будет перезапущен.

Здесь мы определили User=deepak и Group=admin, чтобы убедиться, что скрипт будет выполняться только от имени пользователя deepak, входящего в группу admin.

Теперь нам нужно перезагрузить демон.

sudo systemctl daemon-reload

Давайте включим наш сервис, чтобы он не отключался при перезагрузке сервера.

sudo systemctl enable test.service

А теперь давайте запустим наш сервис.

sudo systemctl start test.service

Теперь наш сервис работает.

Примечание. Файл будет записан в корневой каталог (/), потому что программа запишет путь с точки зрения systemd. Чтобы изменить это, просто отредактируйте путь к файлу. Например:

import time
from datetime import datetime
path_to_file = "введите желаемый путь к файлу"
while True:
    with open(path_to_file, "a") as f:
        f.write("Текущая временная метка: " + str(datetime.now()))
        f.close()
    time.sleep(10)

Есть несколько команд, которые вы можете выполнить для запуска, остановки, перезапуска и проверки состояния.

Чтобы остановить службу.

sudo systemctl stop name_of_your_service

Перезагрузить.

sudo systemctl restart name_of_your_service

Чтобы проверить статус.

sudo systemctl status name_of_your_service

Это было очень поверхностное знакомство с systemd, предназначенное для новичков, которые хотят начать писать свои собственные systemd службы для python.

ПРИМЕЧАНИЕ. Это относится не только к сценариям Python. Вы можете запустить любую программу с ним, независимо от языка программирования, на котором написана ваша программа.