Daemon: что это такое и как используется в программировании

    Команда Simple-Server
    03.06.2026
    10 мин

    Материал подготовлен командой Simple-Server для администраторов VPS и выделенных серверов. Команды и пути проверяйте на тестовой машине перед production.

    Кратко о задаче

    Основная функция демона — предоставлять определённые сервисы другим процессам или самим пользователям. Например, daemon может слушать сетевые порты в ожидании подключения, следить за событиями в системе и запускать действия, когда выполняются определённые условия. Или управлять расписанием работ (cron), отправкой почты (sendmail) и другими задачами.

    В Windows практически аналогичными процессами являются службы (services). Разница между демонами в UNIX/Linux и службами в Windows в основном сводится к тому, как они запускаются, регистрируются, управляются и конфигурируются в контексте конкретной операционной системы. Но назначение одинаковое: обеспечить непрерывную работу некоторых фоновых функций или сервисов.

    Ключевые характеристики демона

    1. Работает в фоновом режиме.

    Пользователь обычно не видит интерфейс daemon; он не пишет сообщения в стандартный вывод (или перенаправляет их в лог), не запрашивает ввода с клавиатуры.

    1. Автономность.

    Daemon запускается либо при загрузке системы, либо когда его вызывает отдельная служба инициализации (например, systemd), либо когда пользователь явно запускает его вручную (через скрипт, cron и т. п.).

    1. Бессрочное исполнение.

    В идеальном случае daemon не должен завершаться, если не произошла критическая ошибка или не поступила явная команда на остановку.

    1. Изоляция.

    Обычно daemon работает под отдельной учётной записью (своим пользователем и группой), чтобы не было лишних привилегий и чтобы каждая служба была максимально безопасна и легко управляема.

    Работает в фоновом режиме.

    Пользователь обычно не видит интерфейс daemon; он не пишет сообщения в стандартный вывод (или перенаправляет их в лог), не запрашивает ввода с клавиатуры.

    Daemon запускается либо при загрузке системы, либо когда его вызывает отдельная служба инициализации (например, systemd), либо когда пользователь явно запускает его вручную (через скрипт, cron и т. п.).

    В идеальном случае daemon не должен завершаться, если не произошла критическая ошибка или не поступила явная команда на остановку.

    Обычно daemon работает под отдельной учётной записью (своим пользователем и группой), чтобы не было лишних привилегий и чтобы каждая служба была максимально безопасна и легко управляема.

    1. Логирование.

    Вместо стандартных потоков ввода/вывода daemon записывает информацию о своей работе в лог-файлы, системный лог (journald, syslog и т. д.), что помогает при диагностике.

    Вместо стандартных потоков ввода/вывода daemon записывает информацию о своей работе в лог-файлы, системный лог (journald, syslog и т. д.), что помогает при диагностике.

    В Linux исторически сложилось, что практически все системные фоновые задачи реализованы в виде демонов. В состав ОС уже входят десятки демонов, каждый из которых отвечает за свою узконаправленную функцию. Рассмотрим основные примеры:

    1. sshd (Secure Shell Daemon)

    Daemon слушает порт 22 (по умолчанию) и позволяет пользователям удалённо подключаться к серверу по зашифрованному протоколу SSH. Без запущенного sshd обеспечить удаленную текстовую консоль практически невозможно.

    1. cron

    Демон планировщика заданий. Он регулярно проверяет списки заданий (crontab) и запускает команды или скрипты в соответствии с расписанием. Это может быть очистка логов раз в неделю, отправка отчетов, проверка состояния системы — что угодно, что хочется автоматизировать по расписанию.

    1. syslogd / rsyslog / journald

    Демоны системного логирования, которые собирают сообщения от ядра, системных утилит, других daemon и приложений, после чего сохраняют их либо в файлы, либо в систему журналирования (journal). Это дает возможность централизованно собирать и анализировать сообщения и ошибки.

    1. NetworkManager или Wicd

    Демоны управления сетевыми настройками, позволяющие автоматизировать подключение к проводным и беспроводным сетям, переключение между ними, настройку приватных сетей и прочие сетевые задачи.

    Daemon слушает порт 22 (по умолчанию) и позволяет пользователям удалённо подключаться к серверу по зашифрованному протоколу SSH. Без запущенного sshd обеспечить удаленную текстовую консоль практически невозможно.

    Демон планировщика заданий. Он регулярно проверяет списки заданий (crontab) и запускает команды или скрипты в соответствии с расписанием. Это может быть очистка логов раз в неделю, отправка отчетов, проверка состояния системы — что угодно, что хочется автоматизировать по расписанию.

    Демоны системного логирования, которые собирают сообщения от ядра, системных утилит, других daemon и приложений, после чего сохраняют их либо в файлы, либо в систему журналирования (journal). Это дает возможность централизованно собирать и анализировать сообщения и ошибки.

    Демоны управления сетевыми настройками, позволяющие автоматизировать подключение к проводным и беспроводным сетям, переключение между ними, настройку приватных сетей и прочие сетевые задачи.

    Все эти демоны запускаются при старте системы, регистрируются в системном менеджере служб (например, systemd). Они работают в течение всего времени до выключения сервера или перезагрузки. При этом пользователь может взаимодействовать с демоном только опосредованно — через конфигурационные файлы, команды в терминале (service, systemctl), или через сетевые запросы (если daemon предоставляет HTTP/S, SSH или другой сетевой интерфейс).

    Как создаются и управляются демоны

    Для реализации демона нужно реализовать следующие шаги:

    1. Ответвление процесса (fork).

    Процесс-родитель запускает fork(), и в дочернем процессе мы продолжаем выполнение кода будущего демона.

    1. Отсоединение от управляющего терминала (setsid).

    Чтобы избежать влияния пользователя, который может случайно закрыть терминал или послать сигнал, демон часто вызывает setsid(), создавая новую сессию и делая себя лидером этого daemon.

    1. Закрытие стандартных дескрипторов ввода/вывода.

    Демон не должен писать в стандартный вывод или ожидать чтения с клавиатуры, поэтому закрывают (или перенаправляют в файл/лог) stdin, stdout и stderr.

    1. Перенаправление сигналов и ведение логов.

    Чтобы корректно завершать работу или перезагружать конфигурацию, daemon обрабатывает сигналы (SIGTERM, SIGHUP и т. д.). Также процессу важно вести логи, обычно через syslog или через файлы.

    1. Основной цикл.

    После инициализации daemon запускает основной цикл: ожидает события, обрабатывает их, снова ожидает и так далее, пока не будет получен сигнал на остановку.

    Ответвление процесса (fork).

    Процесс-родитель запускает fork(), и в дочернем процессе мы продолжаем выполнение кода будущего демона.

    Отсоединение от управляющего терминала (setsid).

    Чтобы избежать влияния пользователя, который может случайно закрыть терминал или послать сигнал, демон часто вызывает setsid(), создавая новую сессию и делая себя лидером этого daemon.

    Закрытие стандартных дескрипторов ввода/вывода.

    Демон не должен писать в стандартный вывод или ожидать чтения с клавиатуры, поэтому закрывают (или перенаправляют в файл/лог) stdin, stdout и stderr.

    Перенаправление сигналов и ведение логов.

    Чтобы корректно завершать работу или перезагружать конфигурацию, daemon обрабатывает сигналы (SIGTERM, SIGHUP и т. д.). Также процессу важно вести логи, обычно через syslog или через файлы.

    После инициализации daemon запускает основной цикл: ожидает события, обрабатывает их, снова ожидает и так далее, пока не будет получен сигнал на остановку.

    Рассмотрим организацию daemon на примере облачного сервера Simple-Server с ОС Ubuntu 22.04.

    1. Вставьте код на языке C в файл mydaemon.c:
    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <syslog.h> int main() { // Открываем syslog openlog("mydaemon", LOG_PID, LOG_DAEMON); syslog(LOG_NOTICE, "Демон запущен"); // Основной бесконечный цикл while (1) { // Ваши фоновые задачи: мониторинг, обработка очередей, и т.д. syslog(LOG_NOTICE, "Выполнение задачи..."); sleep(60); } // Если когда-то выйдем из цикла: syslog(LOG_NOTICE, "Демон остановлен"); closelog(); return 0; }

    Вставьте код на языке C в файл mydaemon.c:

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <syslog.h> int main() { // Открываем syslog openlog("mydaemon", LOG_PID, LOG_DAEMON); syslog(LOG_NOTICE, "Демон запущен"); // Основной бесконечный цикл while (1) { // Ваши фоновые задачи: мониторинг, обработка очередей, и т.д. syslog(LOG_NOTICE, "Выполнение задачи..."); sleep(60); } // Если когда-то выйдем из цикла: syslog(LOG_NOTICE, "Демон остановлен"); closelog(); return 0; }
    1. Скомпилируйте программу с помощью компилятора gcc.

    Если его нет в системе, обновите пакеты:

    sudo apt update && sudo apt upgrade

    И установите компилятор:

    sudo apt install gcc

    Для запуска компиляции:

    gcc mydaemon.c -o mydaemon

    Скомпилируйте программу с помощью компилятора gcc.

    Если его нет в системе, обновите пакеты:

    sudo apt update && sudo apt upgrade gcc mydaemon.c -o mydaemon
    1. Перенесите полученный исполняемый файл в директорию /usr/local/bin/.
      Традиционно служебные утилиты помещают в эту директорию, чтобы гарантировать удобство доступа и соответствие стандартам размещения исполняемых файлов.
    mv mydaemon /usr/local/bin/mydaemon
    1. В Linux с systemd каждый сервис (daemon) описывается в особом unit-файле с расширением .service. Создайте новый файл с именем, например, mydaemon.service:
    sudo nano /etc/systemd/system/mydaemon.service

    Вставьте следующее содержимое:

    [Unit] Description=My Daemon After=network.target [Service] Type=simple ExecStart=/usr/local/bin/mydaemon Restart=on-failure [Install] WantedBy=multi-user.target

    Разберём основные поля:

    Перенесите полученный исполняемый файл в директорию /usr/local/bin/.
    Традиционно служебные утилиты помещают в эту директорию, чтобы гарантировать удобство доступа и соответствие стандартам размещения исполняемых файлов.

    mv mydaemon /usr/local/bin/mydaemon

    В Linux с systemd каждый сервис (daemon) описывается в особом unit-файле с расширением .service. Создайте новый файл с именем, например, mydaemon.service:

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

    Вставьте следующее содержимое:

    [Unit] Description=My Daemon After=network.target [Service] Type=simple ExecStart=/usr/local/bin/mydaemon Restart=on-failure [Install] WantedBy=multi-user.target
    • [Unit]
    * Description — произвольное описание, которое будет видно при выполнении команды `systemctl status mydaemon`. * After — гарантирует, что daemon запустится после указанных служб или таргетов (например, `network.target` даёт уверенность, что сеть уже поднята).
    • [Service]
    * `Type=simple` означает, что процесс «один к одному» совпадает с самим daemon. Если ваш daemon не разветвляется дополнительно, это наиболее простой вариант. * `PIDFile` — обязателен при `Type=forking`, потому что systemd должен знать, какой процесс считать «главным». * `ExecStart` — путь к исполняемому файлу daemon. * `Restart=on-failure` — настройка, указывающая `systemd` автоматически перезапускать daemon, если тот завершился с ошибкой.
    • [Install]
    * `WantedBy=multi-user.target` говорит, что служба должна запускаться в обычной многопользовательской среде (уровне). Это типовое значение для постоянных сервисов.
    • Description — произвольное описание, которое будет видно при выполнении команды systemctl status mydaemon.

    • After — гарантирует, что daemon запустится после указанных служб или таргетов (например, network.target даёт уверенность, что сеть уже поднята).

    Description — произвольное описание, которое будет видно при выполнении команды systemctl status mydaemon.

    After — гарантирует, что daemon запустится после указанных служб или таргетов (например, network.target даёт уверенность, что сеть уже поднята).

    • Type=simple означает, что процесс «один к одному» совпадает с самим daemon. Если ваш daemon не разветвляется дополнительно, это наиболее простой вариант.

    • PIDFile — обязателен при Type=forking, потому что systemd должен знать, какой процесс считать «главным».

    • ExecStart — путь к исполняемому файлу daemon.

    • Restart=on-failure — настройка, указывающая systemd автоматически перезапускать daemon, если тот завершился с ошибкой.

    Type=simple означает, что процесс «один к одному» совпадает с самим daemon. Если ваш daemon не разветвляется дополнительно, это наиболее простой вариант.

    PIDFile — обязателен при Type=forking, потому что systemd должен знать, какой процесс считать «главным».

    ExecStart — путь к исполняемому файлу daemon.

    Restart=on-failure — настройка, указывающая systemd автоматически перезапускать daemon, если тот завершился с ошибкой.

    • WantedBy=multi-user.target говорит, что служба должна запускаться в обычной многопользовательской среде (уровне). Это типовое значение для постоянных сервисов.

    WantedBy=multi-user.target говорит, что служба должна запускаться в обычной многопользовательской среде (уровне). Это типовое значение для постоянных сервисов.

    1. Запустите daemon:
    sudo systemctl daemon-reload # обновляет конфигурацию systemd sudo systemctl start mydaemon # запускает указанный сервис вручную sudo systemctl status mydaemon # показывает статус сервиса mydaemon sudo systemctl daemon-reload # обновляет конфигурацию systemd sudo systemctl start mydaemon # запускает указанный сервис вручную sudo systemctl status mydaemon # показывает статус сервиса mydaemon

    Статус daemon должен быть active:

    В логах будет строка о запуске демона, которая вызвана нашей программой.

    journalctl -u mydaemon.service -e

    Примеры использования демонов

    Их задача — слушать сетевой порт (80 или 443), принимать HTTP/HTTPS-запросы, формировать ответ (HTML-страницу, JSON-данные и т. п.) и возвращать результат клиенту. В большинстве случаев веб-сервер запускается при старте системы и не останавливается, пока сервер не будет выключен или не будет выполнена командная остановка (например, systemctl stop nginx).

    MySQL/MariaDB, PostgreSQL, MongoDB — все они также являются демонами. Запускаются вместе с системой, продолжают работать в фоновом режиме, принимая запросы от клиентских приложений или веб-сервисов. Эти демоны обычно ведут логи, позволяют настраивать конфигурацию через файлы и управляются через специальные утилиты (либо тот же systemd).

    1. Планировщики заданий (cron, atd)

    Daemon cron проверяет таблицу расписаний (crontab) и запускает программы в указанное пользователем время или периодичность. Таким образом можно автоматизировать резервное копирование, обновление системы, мониторинг состояния и многие другие рутинные задачи.

    atd — похожий daemon, но запускает задания однократно в заданный момент времени (в отличие от cron, который работает по расписанию).

    1. Службы доступа и управления (sshd, xrdp)

    sshd (Secure Shell Daemon) обеспечивает удалённый доступ по SSH-протоколу.

    xrdp позволяет подключаться к удалённому рабочему столу через протокол RDP, выступая в качестве демона, который слушает сетевые соединения на определённом порту.

    1. Daemon системы инициализации (systemd, init, Upstart)

    На современных системах роль «главного демона» выполняет systemd (вместо старой схемы SysV init). Systemd запускается первым после ядра, управляет остальными службами и процессами, запускает их параллельно, обрабатывает зависимости. Попросту говоря, systemd сам является демоном, который «руководит» всеми остальными в системе.

    Преимущества и недостатки daemon

    1. Автоматизация
      Демоны позволяют автоматизировать поведение системы: от реакции на сетевые запросы до планирования периодических задач, не требуя участия пользователя.

    2. Изоляция
      Запуск под отдельными учетными данными (пользователь/группа) и закрытие терминалов существенно повышают безопасность, поскольку ограничивают потенциальный вред при взломе daemon.

    3. Непрерывный режим работы
      Daemon может непрерывно обслуживать запросы (например, веб-сервер) и не прекращать работу при разлогинивании пользователя или закрытии консоли.

    4. Управляемость
      В Linux обычно есть системные механизмы (systemd, init-скрипты), позволяющие централизованно управлять всеми демонами: запускать, останавливать, перезапускать, отслеживать логи.

    Автоматизация
    Демоны позволяют автоматизировать поведение системы: от реакции на сетевые запросы до планирования периодических задач, не требуя участия пользователя.

    Изоляция
    Запуск под отдельными учетными данными (пользователь/группа) и закрытие терминалов существенно повышают безопасность, поскольку ограничивают потенциальный вред при взломе daemon.

    Непрерывный режим работы
    Daemon может непрерывно обслуживать запросы (например, веб-сервер) и не прекращать работу при разлогинивании пользователя или закрытии консоли.

    Управляемость
    В Linux обычно есть системные механизмы (systemd, init-скрипты), позволяющие централизованно управлять всеми демонами: запускать, останавливать, перезапускать, отслеживать логи.

    1. Сложность отладки
      Поскольку демон работает в фоновом режиме и не имеет прямого вывода в консоль, отладка требует ведения логов и более сложной настройки (включая полноценное логирование, отладочные ключи, трассировку).

    2. Потенциальные риски безопасности
      Если daemon запускается с повышенными привилегиями (root), его уязвимости могут поставить под угрозу всю систему. Поэтому рекомендуется запускать от имени ограниченного пользователя.

    3. Управление зависимостями
      Не все демоны способны справиться, если требуется, например, доступ к сети, а сеть ещё не поднята. Современные системы инициализации помогают решать эту проблему, но в классических SysV init-скриптах подобные ситуации вызывали трудности.

    4. Повышенный расход ресурсов
      Любой постоянно работающий фоновой процесс потребляет системные ресурсы (оперативную память, процессорное время). Если daemon слишком много, это может сказаться на производительности, особенно в системах с ограниченными ресурсами.

    Сложность отладки
    Поскольку демон работает в фоновом режиме и не имеет прямого вывода в консоль, отладка требует ведения логов и более сложной настройки (включая полноценное логирование, отладочные ключи, трассировку).

    Потенциальные риски безопасности
    Если daemon запускается с повышенными привилегиями (root), его уязвимости могут поставить под угрозу всю систему. Поэтому рекомендуется запускать от имени ограниченного пользователя.

    Управление зависимостями
    Не все демоны способны справиться, если требуется, например, доступ к сети, а сеть ещё не поднята. Современные системы инициализации помогают решать эту проблему, но в классических SysV init-скриптах подобные ситуации вызывали трудности.

    Повышенный расход ресурсов
    Любой постоянно работающий фоновой процесс потребляет системные ресурсы (оперативную память, процессорное время). Если daemon слишком много, это может сказаться на производительности, особенно в системах с ограниченными ресурсами.


    Нужен сервер для практики? Арендуйте VPS/VDS в России — root-доступ, NVMe, DDoS-защита и поддержка 24/7.

    VPS для проекта

    VPS с root-доступом, NVMe и поддержкой 24/7 на Simple-Server.

    StarterVDS

    490₽

    в месяц

    1 ядро

    1 ГБ RAM

    20 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Безлимитный трафик
    Заказать VPS
    Рекомендуем

    PerformanceVDS

    1190₽

    в месяц

    2 ядра

    4 ГБ RAM

    60 ГБ NVMe

    • 1 IPv4
    • KVM
    • Root-доступ
    • Базовая DDoS-защита
    Заказать VPS

    Нужна другая конфигурация или чистый VPS без панели?

    Все тарифы VPS

    Похожие статьи, которые могут быть вам интересны