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 my-worker-@1
Проверяем статус:
systemctl status my-worker-@1
Включаем еще один поток:
systemctl start my-worker-@2
Включаем unit-ы в работу:
systemctl enable my-worker-@1
systemctl enable my-worker-@2
Готово. Теперь можно спокойно перезапускать сервер или убивать процессы воркеров, systemd позаботится о том, чтобы снова перезапустить их.
Вариант без root
В centos-образных системах systemd собран без поддержки демонов, созданных обычными пользователями. В других системах можно создавать unit-ы в домашней директории:
~/.config/systemd/user/my-worker.service