Из-за временных ограничений на территории РФ наблюдаются проблемы с оплатой. Если платёж не проходит, оставьте запрос в службу поддержки.Служба поддержки работает 24/7 — мы всегда на связи по вопросам хостинга и серверов.Открыт прием заявок на аренду выделенных серверов и размещение оборудования в дата-центре.Напоминаем: рекомендуем включить резервное копирование для дополнительной защиты данных.Доступна новая линейка VPS/VDS с NVMe-дисками и увеличенной производительностью.Технические работы на части серверов завершены. Все сервисы работают в штатном режиме.
Статья5 мин чтенияПросмотры0

Как проверить unit-файл systemd до daemon-reload и запуска службы

Проверяем полный unit-кандидат через systemd-analyze verify, разбираем код возврата, опечатку в директиве, отсутствующий исполняемый файл и потерянную зависимость — без daemon-reload и запуска службы.

Комментарии 0

Серверная стойка и набор для проверки конфигурации до изменения службы
В этой статье

Ошибка в unit-файле лучше обнаружить до daemon-reload и запуска службы. Для полного файла-кандидата выполните systemd-analyze verify --man=no ./candidate.service: код 0 позволяет перейти к следующей проверке, а ненулевой код оставляет изменение неподготовленным.

Ниже — воспроизводимая проверка на Ubuntu 24.04, systemd 255 (255.4-1ubuntu8.17), выполненная 10 октября 2026 года. Все четыре unit-файла находились в отдельном рабочем каталоге. Команды systemctl daemon-reload, systemctl start, systemctl restart и перезагрузка не запускались.

Что проверяет systemd-analyze verify

Документация systemd-analyze указывает, что verify загружает переданные unit-файлы, сообщает найденные ошибки и также рассматривает другие unit, на которые они ссылаются. Поэтому результат зависит не только от синтаксиса одной строки, но и от доступных зависимостей и исполняемых файлов.

Это статическая проверка перед применением. Она не отправляет новую конфигурацию работающему менеджеру systemd и не запускает службу. Но и код 0 не доказывает, что приложение подключится к базе, прочитает секрет, получит сеть или успешно отработает под назначенным пользователем.

Сначала зафиксируйте версию

systemd-analyze --version

В тестовой среде первая строка вывода была systemd 255 (255.4-1ubuntu8.17). В другой версии набор проверок и формулировки диагностики могут отличаться, поэтому версию полезно сохранить вместе с результатом.

Подготовьте отдельный unit-кандидат

Минимальный учебный файл назван candidate.service. Расширение важно: по нему systemd определяет тип unit. В примере команда только печатает строку; сам сервис в этой проверке не запускался.

[Unit]

Description=Training verification unit

[Service]

Type=oneshot

ExecStart=/usr/bin/printf systemd-verify-ok

Для Type=oneshot и правил ExecStart= ориентируйтесь на справку systemd.service. Учебный пример не переносит настройки пользователя, каталога, переменных окружения и ограничений из реального сервиса.

Проверьте файл, не применяя его

systemd-analyze verify --man=no ./candidate.service

Параметр --man=no отключает проверку наличия страниц руководства, если в unit используется Documentation=man:. Он не отключает разбор unit, зависимостей и исполняемого файла.

systemd-analyze verify --man=no ./candidate.service; printf 'exit=%s\n' "$?"

Исправный учебный файл не вывел сообщений и вернул exit=0. Повторная проверка дала тот же результат; контрольные суммы файлов до и после совпали.

Проверка unit-кандидата через systemd-analyze verify с переходом по кодам 0 и 1
Код 0 переводит к следующей проверке; код 1 останавливает применение до исправления кандидата.

Три ошибки, которые обнаружились в тесте

В первом дефектном файле директива ExecStart была написана как ExecStrat. Проверка сообщила Unknown key name 'ExecStrat', затем отказалась принимать сервис без команды запуска и вернула 1.

ExecStrat=/usr/bin/printf systemd-verify-ok

Во втором файле путь из ExecStart= отсутствовал. Диагностика Command /opt/example/bin/not-installed is not executable: No such file or directory сопровождалась кодом 1.

ExecStart=/opt/example/bin/not-installed

Третий файл ссылался через Requires= и After= на unit, которого не было в доступных путях загрузки. Проверка сообщила Unit definitely-missing-example.service not found и вернула 1.

Requires=definitely-missing-example.service

After=definitely-missing-example.service

Все три сбоя были воспроизведены дважды. Исправный файл возвращал 0, а опечатка в директиве, отсутствующий исполняемый файл и отсутствующая зависимость — 1.

Матрица четырёх проверок unit-файлов systemd с кодами возврата 0 и 1
В выполненной проверке исправный unit дал 0, а опечатка, отсутствующий исполняемый файл и зависимость — 1.

Не теряйте код возврата

Не передавайте вывод сразу в grep или head: без специальных настроек оболочки вы можете получить код последней команды конвейера вместо кода systemd-analyze. Проще сначала использовать условие и отдельно сохранить диагностику.

if systemd-analyze verify --man=no ./candidate.service >./verify.log 2>&1; then printf 'verify=ok\n' else printf 'verify=stop\n' sed -n '1,80p' ./verify.log fi

В отдельном повторе этот шаблон вывел verify=ok для исправного файла и verify=stop для файла с отсутствующим исполняемым путем. Файл verify.log может содержать пути и имена внутренних unit; храните его с подходящими правами и не публикуйте без просмотра.

Почему пустой вывод ещё не означает готовность

  • Проверка видит доступные ей unit и пути. В другой системе зависимость или исполняемый файл могут присутствовать либо отсутствовать.

  • Полный unit и drop-in — разные объекты. Отдельный файл override.conf нельзя оценивать как самостоятельный сервис без исходного unit и реального порядка наложения.

  • Существование программы не доказывает, что она запустится под User=, получит доступ к WorkingDirectory=, сокету, сертификату или секрету.

  • Проверка не воспроизводит сетевую готовность, лимиты ресурсов, sandbox-настройки, состояние базы и пользовательский сценарий.

  • Сгенерированные и шаблонные unit требуют той же версии генераторов и корректного экземпляра; проверка абстрактного шаблона может не описывать рабочий экземпляр.

Порядок безопасной приёмки

  • Сохраните исходный unit и все drop-in отдельно; зафиксируйте версию systemd.

  • Сформируйте полный кандидат тем же способом, которым его создаёт система управления конфигурацией.

  • Запустите systemd-analyze verify для кандидата и устраните каждое сообщение, а не только ошибки синтаксиса.

  • Сопоставьте ExecStart=, User=, каталоги, зависимости и переменные окружения с планом изменения.

  • Только после согласования применяйте unit штатным способом и выполняйте daemon-reload в управляемом окне.

  • Отдельно проверьте фактический запуск, состояние, журнал и пользовательскую функцию сервиса; держите готовым возврат исходного unit.

Условие остановки простое: любой неизвестный ключ, отсутствующий исполняемый файл, потерянная зависимость или ненулевой код оставляет кандидат неподготовленным. Код 0 закрывает только статическую часть. А дальше нужна проверка именно того процесса и сервиса, которые должны работать после изменения.

Обсуждение 0

Делись опытом и задавай вопросы. Комментарии без ссылок появляются после проверки редактором.

Пока никто не написал. Начни обсуждение.