#Как распознать проблему и где применимы действия
Служба подолгу остаётся в состоянии activating, хотя процесс существует. Значение Type=notify/forking/oneshot определяет, что systemd считает завершённым запуском. Перед выполнением определите название программы, редакцию Linux и управляющий сервис. Значения примеров в командах не являются готовой конфигурацией вашего устройства.
#Возможные причины и диагностические признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Type=notify без уведомления | Демон жив, но не отправляет READY=1 | Проверить поддержку sd_notify и соответствие Type |
| Type=forking с неверным PIDFile | Родитель завершился, но PID основной программы не найден | Проверить PIDFile и способ фонового запуска |
| ExecStartPre или oneshot долго выполняется | Журнал показывает ожидание предпускового скрипта | Диагностировать конкретную долгую операцию |
#Пошаговая диагностика и исправление
- Шаг 1. Определите, на чём задержался unitПосмотрите SubState и Type. В состоянии start-pre, start, start-post происходят разные действия. Не нажимайте Ctrl+C на серверном терминале: systemctl status ничего не меняет.Linux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; systemctl show "$UNIT" -p ActiveState -p SubState -p Type -p MainPID -p TimeoutStartUSec
- Шаг 2. Просмотрите запуск и ошибкиСопоставьте время последней попытки старта с журналом. Для Type=notify сообщение о превышении TimeoutStartSec может означать отсутствие READY=1, а не полный отказ процесса.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; journalctl -u "$UNIT" -b -n 120 --no-pager
- Шаг 3. Проверьте параметры ExecStartPre и PIDFileПокажите unit вместе с drop-in. Системные сервисы Type=forking обычно требуют корректно заданного способа определения главного процесса; нельзя произвольно менять Type на simple.Linux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; systemctl cat "$UNIT"
- Шаг 4. Посмотрите живой процесс и дочерние процессыsystemctl status показывает дерево cgroup; если PID есть, проверьте, не ожидает ли он сеть, секрет или зависимость. Не завершайте процесс до сохранения нужных данных.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)КомандаТерминал Linux на сервере/клиенте, указанном в шаге. Обычно достаточно прав пользователя; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
UNIT='имя.service'; systemctl status "$UNIT" --no-pager -l
- Шаг 5. Проверьте синтаксис локального файлаЕсли в unit есть пользовательские изменения, проверьте фактический основной файл через systemd-analyze verify. Для пакета используйте путь из FragmentPath; отсутствие вывода обычно означает отсутствие проблем формата. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.Linux · Терминал (Bash)КомандаНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo systemd-analyze verify /etc/systemd/system/имя.service
- Шаг 6. Исправьте только обнаруженную причинуЕсли приложение поддерживает notify, настройте его уведомление; если не поддерживает, согласно документации приложения подберите Type. Изменения вносите через drop-in, затем daemon-reload; restart только при согласованном простое. Команды sudo или sudoedit выполняются с полномочиями администратора; если sudo не установлен, используйте разрешённую административную сессию.
- Терминал Linux на сервере/клиенте, указанном в шагеLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Linux на сервере/клиенте, указанном в шаге. Нужны права администратора; имя.service, пути, адрес server.example.org, имена пользователей и другие демонстрационные значения необходимо заменить фактическими. После команды сравните результат с описанием шага; при ошибке остановитесь и выясните её причину.
sudo systemctl edit имя.servicesudo systemctl daemon-reloadКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как проверить, что проблема действительно устранена
Проверка: SubState должен перейти в running (либо dead для успешно завершившегося oneshot), без нового ожидания timeout. Если всё ещё activating, не увеличивайте TimeoutStartSec вслепую — выясните, какую готовность systemd ожидает.
#Если результат не получен
Вернитесь к самому раннему отличающемуся результату диагностики и проверьте точный текст ошибки, текущую загрузку и фактическую версию программы. Не повторяйте опасную команду с другими правами наугад. Если это рабочий сервер, передайте администратору обезличенные отрывки журнала за момент сбоя и уже выполненные действия.