Чем daemon отличается от service в Linux и как читать статусы systemctl

Служба может быть enabled и при этом не работать, active — без постоянно запущенного процесса, а inactive — после успешного выполнения задания. Эти сочетания перестают казаться противоречивыми, если разделить процесс, описание службы и правила её запуска.
Ниже рассматриваем Linux с systemd. Команды и названия состояний основаны на его официальных man-страницах; учебный demo-check.service вымышлен. В другой системе инициализации systemctl может не быть основным инструментом. Сначала читаем состояние, затем выбираем действие: перезапуск без понимания причины способен прервать работу службы и стереть удобный момент для наблюдения.
Daemon — процесс, service unit — управляемое описание
Daemon обычно называют служебную программу, выполняющую работу в фоне. Исторические демоны сами отделялись от терминала и организовывали фоновое выполнение. Руководство systemd различает этот традиционный подход и современные сервисы, которым многие такие действия не нужны: менеджер процессов уже организует их жизненный цикл.
Unit — объект конфигурации и управления systemd. Существуют разные типы: service, socket, timer, mount и другие. Service unit описывает запуск и остановку службы, команды и связанные условия. Не любой unit означает процесс-демон: таймер задаёт запуск по расписанию, а mount относится к монтированию.
Даже service unit не обязательно равен одному постоянно живущему PID. У службы могут быть дочерние процессы; одноразовое задание способно закончиться, сохранив состояние active по настройке. Поэтому искать «тот самый daemon» только по наличию MainPID недостаточно.
Прочитать status по слоям
Для реальной службы подставьте её точное имя:
systemctl status demo-check.service --no-pager
systemctl show demo-check.service -p LoadState -p ActiveState -p SubState -p UnitFileState -p MainPID
status удобен человеку, show выводит свойства, которые легче проверять по отдельности. Состояния относятся к разным вопросам:
| Поле или группа | О чём сообщает | Чего не доказывает |
|---|---|---|
| Loaded / LoadState | Загружено ли описание unit и есть ли проблемы загрузки | Что программа сейчас успешно выполняет бизнес-задачу |
| Active / ActiveState | Общее состояние unit: active, inactive, failed и другие | Что обязательно есть один живой главный процесс |
| Sub / SubState | Более подробное состояние, зависящее от типа unit | Что одно название имеет одинаковый смысл для всех типов |
| UnitFileState | Состояние установки unit, например enabled, disabled, static или masked | Что он уже запущен или остановлен |
| MainPID | Текущий главный PID службы, если он определён | Что отсутствие PID само по себе означает ошибку |
В status строка Loaded может одновременно содержать путь к файлу и enabled. Это не два варианта одного текущего состояния: загруженность конфигурации и правила включения различаются. Значения show удобны, когда длинная строка status вводит в заблуждение.
Active и Sub: почему running и exited оба возможны
active означает активное состояние в смысле типа unit. Для длительно работающей службы часто виден active (running). Для Type=oneshot после завершения действие зависит в том числе от RemainAfterExit. При RemainAfterExit=yes unit может остаться active (exited), хотя команда уже закончилась.
Без RemainAfterExit одноразовая служба после выполнения не обязана оставаться active: inactive (dead) может быть нормальным результатом. Для решения нужно знать замысел unit и результат команды. Отдельная зелёная или серая строка не заменяет чтения настройки.
failed означает, что unit завершился неуспешно: возможны ошибочный выход процесса, сбой, тайм-аут или превышение разрешённой частоты перезапусков. Это категория результата, а не один диагноз. Поля о последнем процессе и журнал помогают определить, что произошло в конкретном случае.
Enabled не равно запущено
enable создаёт связи согласно разделу Install и сам по себе не запускает службу. start запускает сейчас и сам по себе не означает включения при загрузке. Соответственно, enabled вместе с inactive возможно, как и disabled вместе с active.
systemctl is-active demo-check.service
systemctl is-enabled demo-check.service
systemctl list-unit-files --type=service
systemctl list-units --type=service --all
Первые две команды проверяют разные свойства. list-unit-files показывает установленные описания и их состояния, а list-units — units, о которых знает менеджер; это разные списки. Не считайте отсутствие имени в обычном выводе без --all доказательством удаления файла.
static означает, что в unit нет инструкции Install для обычного enable. Это не синоним неисправности: он может запускаться другим unit или вручную, если остальные условия позволяют. masked — более сильное ограничение, препятствующее запуску; оно отличается от просто disabled.
Учебный oneshot: active без daemon в фоне
Рассмотрим описание отдельной тестовой службы, а не существующий файл вашей системы:
[Unit]
Description=Learning one-shot check
[Service]
Type=oneshot
ExecStart=/usr/bin/true
RemainAfterExit=yes
Если такой unit корректно установлен в лабораторной системе и команда завершилась успешно, ожидаемая логика — активное состояние после выхода. Главный процесс уже не обязан существовать. Отсутствие Install также объясняет, почему обычное включение автозапуска здесь не предусмотрено самим файлом.
Этот пример показывает разницу между «действие выполнено» и «программа постоянно работает». Для реального задания путь к исполняемому файлу, зависимости и поведение остановки проектируют отдельно. Не заменяйте описание действующей службы этим учебным фрагментом.
Статус связать с журналом и конфигурацией
При ошибке сначала посмотрите unit и его журнал за текущую загрузку:
systemctl cat demo-check.service
journalctl -u demo-check.service -b -n 50 --no-pager
Опция -u выбирает службу, -b — текущую загрузку, -n 50 ограничивает число строк. Если нужный сбой был до перезагрузки, такое ограничение времени исключит его из результата: скорректируйте выбор журнала. Доступность записей зависит от прав и настроек хранения.
Сопоставьте время попытки запуска с сообщениями приложения и systemd. Сообщение процесса о неверном параметре, невозможность выполнить ExecStart и тайм-аут готовности — разные направления проверки. Посмотрите путь, аргументы, рабочие условия и зависимости из фактического unit, включая drop-in-настройки, которые показывает cat.
Краткий хвост журнала внутри status не обязательно содержит самое раннее полезное сообщение. Если видно несколько быстрых неудачных перезапусков, найдите исходную ошибку, а не только последнюю запись об ограничении запуска. При автоматизации учитывайте код возврата команды проверки: неактивная служба может дать ненулевой результат status или is-active, хотя сама проверка успешно определила состояние.
Какие действия что меняют
| Действие | Назначение |
|---|---|
| start / stop | Запустить или остановить unit сейчас |
| restart | Перезапустить; действие может прервать текущую работу |
| reload | Попросить службу перечитать её конфигурацию, если это поддерживается |
| daemon-reload | Перечитать конфигурацию units менеджером systemd; это не перезапуск всех приложений |
| enable / disable | Изменить включение по Install; без --now это не непосредственный запуск или остановка |
| mask / unmask | Установить или снять маскировку, отдельно от текущего запуска |
Например, после изменения файла unit обычно нужно перечитать описание менеджером, а затем применить подходящее действие к конкретной службе. reload приложения и daemon-reload менеджера не взаимозаменяемы. Для системного менеджера изменения обычно требуют административных прав; пользовательские units управляются через systemctl --user и относятся к другому менеджеру.
Если unit masked, сначала выясните, почему ограничение установлено. Автоматическое unmask ради исчезновения сообщения может отменить осознанную политику администратора. reset-failed убирает сохранённое состояние отказа и связанные счётчики, но не ремонтирует причину падения программы.
Практический порядок чтения прост: существует ли нужное описание, какое у него общее и подробное состояние, что происходило с процессом, как настроено включение и что говорит журнал. Такой разбор помогает выбрать конкретное действие вместо привычки перезапускать всё, что выглядит непривычно.



