Systemd давно стал стандартом для запуска, управления и наблюдения за сервисами. Но многие используют его только для управления уже существующими демонами и не создают собственные unit-файлы, а ведь это удобный способ автоматизировать любые скрипты, фоновые процессы или приложения.
▪️ Шаг 1: создаём unit-файл. Все пользовательские сервисы кладутся в:
/etc/systemd/system/
Пример простого сервиса, который запускает bash-скрипт:
/etc/systemd/system/myapp.service
[Unit]
Description=My custom app
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
User=myuser
Group=myuser
[Install]
WantedBy=multi-user.target
Несколько рекомендаций по параметрам:Type=simple- подходит для скриптов и обычных демоновRestart=on-failure- перезапуск при сбояхUser=…- всегда запускайте сервисы НЕ от root, если это возможноAfter=network.target- ожидаем сеть перед запуском
▪️ Шаг 2: корректно пишем исполняемый скрипт. Для стабильной работы сервисов:
указываем shebang (#!/bin/bash);
используем абсолютные пути к бинарникам;
перенаправляем вывод в syslog или файл (если нужно);
завершаемся с кодами ошибок.
Пример:
#!/bin/bash
set -e
echo "Service started"
ping -c 1 8.8.8.8
Не забываем:
chmod +x /usr/local/bin/myapp.sh
▪️ Шаг 3: включаем и запускаем сервис
systemctl daemon-reload
systemctl enable --now myapp.service
Проверяем статус:
systemctl status myapp.service
▪️ Отладка. Systemd имеет отличные инструменты диагностики.
Посмотреть логи сервиса:
journalctl -u myapp.service -f
Проверить последнюю ошибку:
systemctl status myapp.service
Проверить, что systemd видит изменения:
systemctl daemon-reload
Принудительно перезапустить сам процесс:
systemctl restart myapp.service
▪️ Полезные параметры, которые часто забывают
LimitNOFILE - увеличить максимальное количество файлов
LimitNOFILE=65535WorkingDirectory - задать рабочую директорию
WorkingDirectory=/opt/myappEnvironment - задать переменные окружения
Environment="APP_ENV=prod"▪️ Безопасность. Systemd умеет частично изолировать сервисы, похожим образом на контейнеры, например:
ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true
#linux #systemd
🧑💻 NetworkAdmin