Как описать исполняемый файл как демон (службу) в Linux?

«Как описать исполняемый файл как демон (службу) в Linux?» — вопрос из категории Linux, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Современный стандарт для управления демонами в Linux — это systemd. Вы описываете службу в виде юнит-файла с расширением .service.

Шаги по созданию службы:

  1. Создайте юнит-файл в /etc/systemd/system/ (для системных служб) или ~/.config/systemd/user/ (для пользовательских).

    sudo nano /etc/systemd/system/myapp.service

  2. Пример содержимого для простого демона:

    [Unit]
    Description=My Application Service
    After=network-online.target  # Запускать после поднятия сети
    Wants=network-online.target
    
    [Service]
    Type=simple                  # Подходит для большинства демонов
    User=appuser                 # Запускать от имени непривилегированного пользователя
    Group=appgroup
    ExecStart=/usr/local/bin/myapp --config /etc/myapp/config.yaml
    Restart=on-failure          # Перезапускать при аварийном завершении
    RestartSec=5s               # Ждать 5 секунд перед перезапуском
    Environment="LOG_LEVEL=info" # Переменные окружения
    LimitNOFILE=65536           # Установить лимит на открытые файлы
    
    # Опционально: секция для запуска в chroot или с приватными пространствами имён
    PrivateTmp=true
    NoNewPrivileges=true
    
    [Install]
    WantedBy=multi-user.target  # В какой "цели" активировать службу
  3. Активируйте и запустите службу:

    # Перезагрузить конфигурацию systemd
    sudo systemctl daemon-reload
    # Включить автозагрузку при старте системы
    sudo systemctl enable myapp.service
    # Запустить службу сейчас
    sudo systemctl start myapp.service
    # Проверить статус
    sudo systemctl status myapp.service

Ключевые параметры [Service]:

  • Type: simple (по умолчанию), forking (для демонов, которые сами себя отсоединяют), oneshot (для скриптов, выполняющихся один раз).
  • Restart: on-failure, always, no.
  • User/Group: Критически важно запускать приложения от непривилегированного пользователя в целях безопасности.

В своей работе я всегда добавляю LimitNOFILE и PrivateTmp для изоляции и устанавливаю корректные зависимости (After=) для порядка запуска в системе.