systemd Linux с systemd (конкретный дистрибутив и версия могут отличаться)

Как проверить зависимости After и Requires в unit-файле

  • Обновлено
  • Чтение ≈ 3 минуты
  • Нужны права администратора

Краткий ответ

После изменения After= и Requires= служба неожиданно запускается раньше другой или не стартует при отказе зависимости. After задаёт порядок, Requires притягивает зависимость, но не гарантирует её готовности.

В этой статье
  1. Как распознать проблему и где применимы действия
  2. Возможные причины и диагностические признаки
  3. Пошаговая диагностика и исправление
  4. Как проверить, что проблема действительно устранена
  5. Если результат не получен

#Как распознать проблему и где применимы действия

После изменения After= и Requires= служба неожиданно запускается раньше другой или не стартует при отказе зависимости. After задаёт порядок, Requires притягивает зависимость, но не гарантирует её готовности. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.

#Возможные причины и диагностические признаки

Возможная причинаКак узнатьЧто делать
Есть только After=Зависимый unit не активируется автоматическиДобавить Wants/Requires, если это оправдано
Есть только Requires=Зависимость подтягивается, но порядок не фиксированДобавить After, если действительно нужно ждать её запуска
Неправильное имя или циклВ журнале transaction/ordering cycle либо unit not foundПроверить имена и граф зависимостей

#Пошаговая диагностика и исправление

  1. Шаг 1. Получите фактический объединённый unitКоманда показывает [Unit] и все drop-in. Отметьте конкретные After, Before, Wants, Requires; не редактируйте пакетный файл ради проверки.
    Linux · Терминал (Bash)Команда
    Терминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    UNIT='имя.service'; systemctl cat "$UNIT"
  1. Шаг 2. Посмотрите вычисленные зависимостиsystemctl show отражает итоговый набор отношений. Если ожидаемого имени нет, возможно, вы написали не то имя либо не перечитали файлы.
  2. Терминал Linux на сервере/клиенте, указанном в шаге
    Linux · Терминал (Bash)Команда
    Терминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    UNIT='имя.service'; systemctl show "$UNIT" -p After -p Requires -p Wants
  1. Шаг 3. Просмотрите обратную цепочкуlist-dependencies показывает дерево требуемых служб, --reverse — кто зависит от выбранного unit. Не путайте дерево требований с временной последовательностью запуска.
  2. Терминал Linux на сервере/клиенте, указанном в шаге
    Linux · Терминал (Bash)Команда
    Терминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    UNIT='имя.service'; systemctl list-dependencies "$UNIT" --all --no-pager
  1. Шаг 4. Проверьте цепочку старта по журналуСопоставьте временные отметки обеих служб. Одного After=network.target недостаточно для получения IP: здесь нужен другой целевой юнит и соответствующая сетевая служба ожидания.
  2. Терминал Linux на сервере/клиенте, указанном в шаге
    Linux · Терминал (Bash)Команда
    Терминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    UNIT='имя.service'; journalctl -b -u "$UNIT" -o short-iso --no-pager | tail -n 45
  1. Шаг 5. Проверьте конфигурацию до измененийsystemd-analyze verify сообщает проблемы с синтаксисом и некоторыми зависимостями. Для конкретного unit укажите его действительный путь, который нашли через FragmentPath. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
    Linux · Терминал (Bash)КомандаНужен sudo
    Терминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    sudo systemd-analyze verify /etc/systemd/system/имя.service
  1. Шаг 6. Исправьте порядок и примените безопасноЕсли это ваша собственная служба и нужен обязательный запуск другой службы, используйте [Unit] Wants=другая.service и After=другая.service; Requires применяйте только когда отказ зависимости должен блокировать запуск. Затем daemon-reload. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
  2. Терминал Linux на сервере/клиенте, указанном в шаге
    Linux · Терминал (Bash)С осторожностьюНужен sudo
    Терминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
    sudo systemctl edit имя.service
    sudo systemctl daemon-reload

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Как проверить, что проблема действительно устранена

Откройте systemctl show с нужным именем и сверяйте две конкретные службы после следующего контролируемого запуска. При цикле зависимости уберите добавленные строки из собственного override и повторите daemon-reload.

#Если результат не получен

Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.