Что такое демон-процесс в Linux?

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

Ответ

Демон (daemon) — это фоновый процесс в Linux, который работает независимо от управляющего терминала и обычно запускается при старте системы для выполнения сервисных задач (веб-сервер, cron, системный логгер).

Характеристики демона:

  • Отсоединение от терминала: Демон не имеет управляющего TTY. Это предотвращает получение сигналов (например, SIGHUP) при закрытии терминала пользователя.
  • Работа в фоне: Не требует интерактивного ввода от пользователя.
  • Именование: Имена демонов часто оканчиваются на d (systemd, sshd, nginx).
  • Родительский процесс: Обычно имеет PID 1 (systemd или init) в качестве родителя после завершения процесса-родителя, создавшего демона.

Как создается демон (классический способ):

  1. fork(): Создание дочернего процесса и завершение родительского.
  2. setsid(): Создание новой сессии и группы процессов, отвязка от управляющего терминала.
  3. chdir("/"): Смена рабочей директории на корневую, чтобы не блокировать точки монтирования.
  4. umask(0): Сброс маски создания файлов для полного контроля над правами.
  5. Закрытие файловых дескрипторов (close(STDIN_FILENO) и т.д.).

Управление демонами в современных системах (через systemd):

# Просмотр статуса демона
sudo systemctl status nginx

# Запуск, остановка, перезагрузка
sudo systemctl start nginx
sudo systemctl stop nginx
sudo systemctl reload nginx  # Для применения конфигов без простоя

# Включение/отключение автозапуска
sudo systemctl enable nginx
sudo systemctl disable nginx

# Просмотр логов демона
sudo journalctl -u nginx -f

Практический пример: Когда я настраиваю собственное приложение как сервис, я создаю unit-файл для systemd:

# /etc/systemd/system/my-app.service
[Unit]
Description=My Custom Application
After=network.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/opt/myapp
ExecStart=/usr/bin/python3 /opt/myapp/app.py
Restart=on-failure

[Install]
WantedBy=multi-user.target

Это обеспечивает управление жизненным циклом, логирование через journald и автоматический перезапуск при сбоях.