Демон (daemon) — долгоживущий фоновый процесс в Unix-подобных ОС, не привязанный к управляющему терминалу пользователя. Демон работает независимо от входа в систему, обычно запускается при старте ОС и завершается при выключении. Большинство серверных приложений работают как демоны: nginx, sshd, postfix, mysqld, postgresql, crond, rsyslogd.
Характеристики демона
Типичный демон отличается от обычного процесса рядом свойств:
- Отвязан от управляющего терминала (tty) — не получает SIGHUP при закрытии терминальной сессии.
- Запущен через double-fork: родительский процесс завершается, дочерний продолжает работу в новой сессии.
- Вызывает
setsid()— создаёт новую сессию без управляющего терминала. - Меняет рабочую директорию на
/— предотвращает блокировку размонтирования ФС. - Перенаправляет stdin/stdout/stderr на
/dev/nullили лог-файл. - Записывает PID в
/var/run/имя.pidдля управления и предотвращения дублей.
Управление демонами через systemd
В современных Linux-системах демоны управляются через systemd и описываются юнит-файлами (/etc/systemd/system/). systemd обрабатывает double-fork, PID-файлы и перезапуск автоматически — современным демонам не нужно реализовывать это вручную.
[Unit]
Description=My Application Daemon
After=network.target postgresql.service
[Service]
Type=simple
User=appuser
Group=appgroup
WorkingDirectory=/opt/myapp
ExecStart=/usr/local/bin/myapp --config /etc/myapp/config.yaml
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=5s
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
Restart=on-failure — systemd перезапускает демон при ненулевом коде завершения. Type=notify — для демонов, которые сообщают systemd о готовности через sd_notify().
История термина
Слово «daemon» ввёл Фернандо Корбато (Fernando Corbató) в MIT в 1963 году для системы CTSS — по аналогии с «демоном Максвелла» из термодинамики (Maxwell's daemon): гипотетический агент, работающий в фоне и сортирующий молекулы. Произносится «dee-mon» (как в мифологии) или «day-mon». В Version 7 Unix (1979) стандартизирован набор системных демонов: cron, inetd, lpd, syslogd.
Типы демонов
- Network daemons — обслуживают сетевые подключения: nginx, sshd, named, postfix.
- System daemons — системные сервисы: crond (планировщик), udevd (устройства), ntpd/chronyd (время).
- Application daemons — серверные приложения: postgresql, redis-server, elasticsearch.
- Super-daemons — демоны, запускающие другие демоны по запросу: inetd, xinetd (устаревшие), systemd socket activation.
Демоны в хостинге
На VPS-сервере типичный набор демонов: nginx (веб-сервер), sshd (SSH), postgresql или mysql (база данных), redis-server (кэш), postfix (почта), crond (планировщик задач), rsyslogd/journald (логирование), chronyd (синхронизация времени). Диагностика зависших демонов: systemctl status имя-сервиса, journalctl -u имя-сервиса -n 100 --no-pager. Просмотр всех запущенных сервисов: systemctl list-units --type=service --state=running.
Перехват сигналов демоном
Демоны обрабатывают POSIX-сигналы для управления поведением без перезапуска:
- SIGHUP (1) — традиционно используется для reload конфигурации. Nginx:
nginx -s reloadилиkill -HUP $(cat /var/run/nginx.pid). Демон перечитывает конфиг без разрыва существующих соединений. - SIGTERM (15) — корректное завершение. Демон завершает текущие задачи и выходит.
- SIGKILL (9) — принудительное завершение. Нельзя перехватить. Используется только при зависании процесса.
- SIGUSR1 / SIGUSR2 — определяются самим демоном. Например, Nginx использует SIGUSR1 для ротации логов.
systemd передаёт SIGTERM при systemctl stop и ждёт завершения максимум TimeoutStopSec секунд. После timeout — SIGKILL.