Служба застряла в состоянии deactivating
Состояние остановки, которое не заканчивается, блокирует и перезапуск, и выключение машины. Причины делятся на две группы: процесс игнорирует сигнал завершения или находится в состоянии, из которого его нельзя убить. Вторая группа сигналами не лечится.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Процесс не реагирует на сигнал завершения
Программа не обрабатывает сигнал или занята длительной операцией. systemd ждёт до истечения таймаута остановки.
-
Процесс в непрерываемом ожидании
Процесс ждёт ввода-вывода и не получает сигналов вовсе. Ни один сигнал его не завершит.
-
Режим остановки оставляет дочерние процессы
При остановке только главного процесса дочерние остаются и держат срез службы активным.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Таймаут и способ остановки службы.
systemctl show myapp.service -p TimeoutStopSec -p KillMode -p KillSignalКакие процессы ещё живы в срезе службы.
systemd-cgls -u myapp.serviceПроцессы в непрерываемом ожидании.
ps -eo pid,stat,wchan:24,cmd | awk '$2 ~ /D/'Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Программа не обрабатывает сигнал или занята длительной операцией. systemd ждёт до истечения таймаута остановки.
- Как проверить
-
Посмотрите таймаут и состояние процессов службы.
systemctl show myapp.service -p TimeoutStopSec -p KillSignal -p KillMode ps -o pid,stat,wchan:20,cmd -C myapp 2>/dev/null
- Как исправить
- Задайте разумный таймаут остановки: по его истечении systemd применит жёсткий сигнал. Бесконечное ожидание останавливает и выключение машины.
- Почему происходит
- Процесс ждёт ввода-вывода и не получает сигналов вовсе. Ни один сигнал его не завершит.
- Как проверить
-
Посмотрите состояние процессов.
ps -eo pid,stat,wchan:24,cmd | awk '$2 ~ /D/' | head
- Как исправить
- Устраните причину ожидания: недоступный диск или сетевую файловую систему. До этого процесс не завершится, сколько ни ждать.
- Почему происходит
- При остановке только главного процесса дочерние остаются и держат срез службы активным.
- Как проверить
-
Посмотрите режим остановки и дерево процессов службы.
systemctl show myapp.service -p KillMode -p FinalKillSignal systemd-cgls -u myapp.service 2>/dev/null | head
- Как исправить
- Выберите режим остановки, завершающий всю группу процессов. Режим с одним главным процессом уместен редко и требует, чтобы программа убирала за собой сама.
Пример вывода
Процесс не реагирует, служба висит в остановке. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
systemd[1]: Stopping myapp.service - My application...
systemd[1]: myapp.service: State 'stop-sigterm' timed out. Killing.
systemd[1]: myapp.service: Killing process 9600 (myapp) with signal SIGKILL.
systemd[1]: myapp.service: Processes still around after SIGKILL. Ignoring.
Связанные ошибки
- A stop job is running: выключение висит Перезагрузка останавливается с обратным отсчётом: служба не завершается. Как найти и сократить ожидание.
- task blocked for more than 120 seconds Ядро сообщает о процессе, зависшем в ожидании ввода-вывода дольше двух минут. Служба при этом не отвечает и не убивается.
- signal=KILL (status=9/KILL) в systemd Процесс службы убит сигналом KILL. Кто мог его послать: OOM-killer, таймаут остановки systemd, администратор.
- Failed with result «success»: странное сочетание в журнале Служба помечена упавшей с результатом «успех»: разбор этого сочетания и когда оно нормально.
- No such process при остановке или сигнале Ошибка 3: процесса с таким номером нет. Разбор для команд остановки и подстановки номера процесса.
- Target is busy: точка монтирования занята Не удаётся отмонтировать: target is busy. Как найти процессы, которые держат точку монтирования, и корректно освободить её.
- signal=INT и signal=QUIT в systemd Процесс службы завершён сигналом INT или QUIT. Кто их посылает службам и почему это обычно не systemd.
- signal=TERM (status=15/TERM) в systemd Процесс службы завершён сигналом TERM. Когда это нормальная остановка, а когда признак проблемы.
Источники
-
systemd.kill(5)
KillMode=, KillSignal= и порядок остановки. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: процесс в непрерываемом ожидании не завершается жёстким сигналом.