Полное руководство по написанию файлов служебных модулей Systemd: объяснение методов ExecStart и ExecStop

Systemd — широко используемая система инициализации и менеджер служб в Linux. При создании файла модуля службы systemd директивы ExecStart и ExecStop необходимы для определения команд запуска и остановки службы соответственно. В этой статье мы рассмотрим различные способы указания этих директив на примерах кода.

Метод 1: выполнение одной команды
Самый простой способ определить директивы ExecStart и ExecStop — указать одну команду. Например, давайте создадим службу, которая запускает и останавливает простой веб-сервер:

[Unit]
Description=Мой веб-сервер

[Service]
ExecStart=/usr/bin/python3 /path/to/server.py
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=always

Метод 2: использование сценариев оболочки
Вы также можете использовать сценарии оболочки для выполнения более сложных команд или дополнительных действий перед запуском или остановкой службы. Вот пример:

[Unit]
Description=Моя услуга

[Service]
ExecStart=/path/to/start.sh
ExecStop=/path/to/stop.sh

start.sh:

!/bin/bash

echo “Запуск службы…”
/path/to/service_command

stop.sh:

!/bin/bash

echo «Остановка моей службы…»
/path/to/stop_command

Метод 3: выполнение нескольких команд
Если вам нужно запустить несколько команд в рамках процесса запуска или остановки службы, вы можете использовать директивы ExecStartPre, ExecStartPost, ExecStopPre и ExecStopPost. Они позволяют указать команды, которые выполняются до или после основной команды запуска или остановки. Вот пример:

[Unit]
Description=Моя услуга

[Сервис]
ExecStartPre=/путь/к/команде перед запуском
ExecStart=/путь/к/команде запуска
ExecStartPost=/путь/к/команде после запуска
ExecStopPre=/path/to/pre-stop-command
ExecStop=/path/to/stop-command
ExecStopPost=/path/to/post-stop-command

Метод 4: использование переменных среды
Systemd позволяет вам определить переменные среды для вашего сервисного подразделения. Это может быть полезно при настройке команд ExecStart и ExecStop. Вот пример:

[Unit]
Description=Моя услуга

[Сервис]
Environment=MY_PATH=/path/to/service
ExecStart=${MY_PATH}/start.sh
ExecStop=${MY_PATH}/stop.sh

В этой статье мы рассмотрели различные методы определения директив ExecStart и ExecStop в файлах служебных модулей systemd. Если вам нужно выполнить одну команду, использовать сценарии оболочки, выполнить несколько команд или использовать переменные среды, systemd обеспечивает гибкость и универсальность. Используя эти методы, вы сможете эффективно управлять своими службами в среде Linux.