Создать unit в systemctl

systemctl - это интерфейс для работы с демонами под управлением systemd.

Демон - программа, постоянно находящаяся в памяти и обрабатывающая запросы.

Примеры стандартных для сервера демонов: sshd, nginx. Создав unit в systemctl мы сможем поддерживать нужную программу все время запущенной и автоматически перезапускать её в случае падения.

Для примера создадим демона для программы, лежащей по адресу /app/my_worker, запустим её в 2 потока. Нам понадобится доступ root.

Создадим в директории /etc/systemd/system/ файл с именем [email protected]. Символ @ будет заменен номером процесса (т.к. их будет больше 1). Если планируется запускать в 1 поток, можно называть без @.

Созданный файл - это и есть наш unit. Заполним его:

[Unit]
 
 # Описание. Здесь %i - номер процесса
Description=My worker \# %i 

# Зависимости юнита, т.е. после каких сервисов запускать этот unit.
# В данном случае, указаны системный логгер, сеть и редис
After=syslog.target network.target redis.target 

[Service]
Environment=PATH=/usr/bin:/usr/local/bin

# Путь до pid-файла - в нем будет лежать id процесса, когда он будет запущен.
PIDFile=/var/run/my-worker-%i.pid

# Рабочая директория
WorkingDirectory=/app/

# Скрипт для запуска программы. Он будет выполняться как при начальном запуске, так и в случае падения демона
ExecStart=/bin/bash -ce "/app/my_worker > /app/my-worker-%i.log 2> /app/my-worker-%i.error.log"

# Перезапускать через 10 секунд после падения
RestartSec=10
Restart=always

# Пользователь и группа, от лица которых нужно запускать демона
User=my_user
Group=my_user

[Install]
WantedBy=multi-user.target

Запуск и тестирование

Запустить демона с помощью systemctl можно так:

systemctl start [email protected]

Проверяем статус:

systemctl status [email protected]

Включаем еще один поток:

systemctl start [email protected]

Включаем unit-ы в работу:

systemctl enable [email protected]
systemctl enable [email protected]

Готово. Теперь можно спокойно перезапускать сервер или убивать процессы воркеров, systemd позаботится о том, чтобы снова перезапустить их.

Вариант без root

В centos-образных системах systemd собран без поддержки демонов, созданных обычными пользователями. В других системах можно создавать unit-ы в домашней директории:

~/.config/systemd/user/my-worker.service
published 2020-02-20 13dagger