Приходилось ли вам писать unit-файлы для systemd?

«Приходилось ли вам писать unit-файлы для systemd?» — вопрос из категории Linux и ОС, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в проектах по разработке серверных приложений на C++ под Linux мне приходилось создавать и настраивать unit-файлы для systemd. Это необходимо для интеграции сервиса в систему: автозапуск, управление (start/stop/restart), централизованное логирование в journald и корректная обработка зависимостей.

Пример unit-файла для скомпилированного C++ демона /opt/myapp/bin/server:

[Unit]
Description=My High-Performance C++ Server
After=network.target postgresql.service # Зависимости
Requires=postgresql.service

[Service]
Type=simple
# Путь к бинарнику
ExecStart=/opt/myapp/bin/server --config /etc/myapp/config.yaml
# Пользователь и группа для изоляции
User=appuser
Group=appgroup
# Автоматический перезапуск при падении
Restart=on-failure
RestartSec=5
# Лимиты ресурсов (важно для C++ сервисов)
LimitNOFILE=65536
# Рабочая директория
WorkingDirectory=/var/lib/myapp
# Перенаправление stdout/stderr в journald
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Типичный workflow развертывания:

# 1. Копируем unit-файл
sudo cp myapp.service /etc/systemd/system/
# 2. Перечитываем конфигурацию systemd
sudo systemctl daemon-reload
# 3. Включаем автозапуск при загрузке
sudo systemctl enable myapp.service
# 4. Запускаем сервис
sudo systemctl start myapp.service
# 5. Проверяем статус и логи
sudo systemctl status myapp.service
sudo journalctl -u myapp.service -f

Для отладки C++ приложения полезно использовать Type=forking или Type=notify, если сервис поддерживает systemd readiness notification.