Вопрос или проблема
named запускается и работает нормально, если я запускаю его вручную (“/usr/sbin/named -u named”), но когда я запускаю его с помощью systemctl, он выдает ошибку:
# systemctl start named
Job for named.service failed because a timeout was exceeded. See "systemctl status named.service" and "journalctl -xe" for details.
Статус показывает обычные сообщения named, однако “ps alx”, пока он все еще работает, показывает, что он как будто ищет ввод пароля где-то, чего он не должен делать, но, возможно, это особенность systemctl и просто ложный след:
4 0 18608 28440 20 0 134824 1296 poll_s S+ pts/1 0:00 systemctl start named
0 0 18609 18608 20 0 15428 824 poll_s S+ pts/1 0:00 /usr/bin/systemd-tty-ask-password-agent --watch
0 0 18610 18608 20 0 294680 3056 poll_s Sl+ pts/1 0:00 /usr/bin/pkttyagent --notify-fd 5 --fallback
5 25 18624 1 20 0 294512 146616 sigsus Ssl ? 0:06 /usr/sbin/named -u named -c /etc/named.conf
В любом случае, надеюсь, кто-то знает, в чем дело…
Вы можете проверить конфигурацию named.conf с помощью команды named-checkconf.
named-checkconf /etc/named.conf
Если команда не выдает никаких сообщений, то ваша конфигурация named.conf в порядке.
Если есть ошибка, вы увидите ссылку на ошибку.
Проблема оказалась в том, что systemd искал файл процесса PID в другом месте, чем его создавал named.conf:
May 3 16:04:59 ns2 systemd: PID file /run/named/named.pid not readable (yet?) after start.
options {
directory "/var/named";
pid-file "/var/run/named/pid";
}
Для меня (Ubuntu 24.04.2) файл юнита по умолчанию в /usr/lib/systemd/system/named.service
имел Type=notify
и по какой-то причине это вызывало ошибку.
Стандартная практика — скопировать в /etc
перед изменением (пусть ОС управляет /usr
и /lib
). Эта команда убедится, что в /etc
нет файла службы, а затем создаст его:
[ -f /etc/systemd/system/named.service ] || \
cp /usr/lib/systemd/system/named.service /etc/systemd/system/named.service
Затем используйте ваш редактор, чтобы закомментировать эту строку с помощью точки с запятой (;
) или хэша (#
):
Type=notify
Это позволит ей вернуться к значению по умолчанию Type=simple
.
Перезапустите службу, чтобы завершить задачу.
systemctl stop named
systemctl daemon-reload
systemctl start named
Ответ или решение
Проблема запуска службы named
на CentOS 7, которая стартует вручную, но сообщает о тайм-ауте при использовании systemctl
, часто связана с несовпадением конфигураций между systemd
и самим приложением named
. Ниже приведена попытка детально рассмотреть проблему и предложить решения для исправления ситуации.
Теоретическая часть
Конфигурация и система инициализации
systemd
— это система инициализации и управления сервисами в современных дистрибутивах Linux, в том числе в CentOS 7. Одной из функций systemd
является мониторинг жизненного цикла служб и управление ими с использованием файлов конфигураций, известных как "unit-файлы".
Когда systemd
пытается запустить службу, он следит за процессом, используя тип загрузки, указанный в unit-файле. В вашей ситуации unit-файл по умолчанию настроен на Type=notify
. Этот тип требует, чтобы сервис отправлял уведомление READY=1
, когда он готов. Если такое уведомление не придёт, systemd
определяет, что служба не стартовала корректно, и выводит сообщение о тайм-ауте.
Файл PID
Файл PID (Process ID
) играет ключевую роль в идентификации запущенного процесса. В named
файлы PID по умолчанию могут располагаться в разных директориях, что требует управлять этой информацией согласовано как в конфигурации самого приложения, так и в unit-файлах.
Примеры и анализ
-
Конфигурация
named
(named.conf)Из предоставленных данных видно, что конфигурация
named
, позиционирует файл pid в/var/run/named/pid
. Это местоположение должно совпадать с тем, что ожидаетsystemd
.options { directory "/var/named"; pid-file "/var/run/named/pid"; }
-
Системный журнал и диагностика
Работа с
systemctl
показывает тайм-аут, однакоps alx
демонстрирует, что служба запускается, но вероятно ждёт ввода пароля, что может быть ложным выводом.При этом, лог
May 3 16:04:59 ns2 systemd: PID file /run/named/named.pid not readable (yet?) after start
указывает на проблему с доступностью файла PID в ожидаемом местоположении. Это может быть связано с тем, что разные компоненты системы ожидают файл по разным адресам. -
Файл unit
Конфигурация unit-файла должна корректно описывать путь к файлу PID и корректный тип загрузки.
[Unit] Description=BIND Domain Name Server [Service] Type=simple # Изменение с notify на simple может помочь избежать неудачных попыток согласования уведомлений. PIDFile=/var/run/named/pid # Убедитесь, что этот путь соответствует `named.conf`. [Install] WantedBy=multi-user.target
Применение и исправление
-
Обновление unit-файла
Во избежание некорректных изменений в системных директориях, единицей конфигурации
systemd
лучше управлять в/etc/systemd/system/
.[ -f /etc/systemd/system/named.service ] || cp /usr/lib/systemd/system/named.service /etc/systemd/system/named.service
После чего, отредактируйте файл: закомментируйте строку с
Type=notify
, чтобыsystemd
перешел на дефолтType=simple
. -
Согласование путей к файлам PID
Убедитесь, что
PIDFile
в конфигурацииsystemd
совпадает с тем, что установленnamed
. -
Перезапуск службы
После всех изменений выполните следующие команды:
systemctl stop named systemctl daemon-reload systemctl start named
Эти шаги позволят системе распознать новые конфигурационные изменения и корректно стартовать службу.
Синхронизация ожиданий systemd
и конфигурации named
критична для устойчивой работы службы. Ваша задача — убедиться, что все компоненты системы корректно взаимодействуют друг с другом, особенно в части управления процессами и их идентификацией через PID файлы. Надеюсь, это решение поможет в устранении тайм-аута при запуске службы named
.