A stop job is running for Session — Решение зависания перезагрузки Linux
Архитектура ошибки и симптомы сбоя
Сообщение «A stop job is running for Session X of user Y (1min 30s / no limit)» появляется при выключении или перезагрузке ОС (reboot / poweroff). Ошибка означает, что systemd-logind отправил сигнал SIGTERM процессам пользовательской сессии (фоновые демоны tmux, screen, gpg-agent, зависшие SSH-сессии, процессы браузеров), но процессы проигнорировали сигнал и не завершились. Диспетчер systemd блокирует выключение сервера, ожидая истечения глобального таймаута (по умолчанию 90 секунд) перед отправкой SIGKILL.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| DefaultTimeoutStopSec | 90s (Default) | Глобальное время ожидания завершения служб и сессий перед принудительным SIGKILL. |
| systemd-logind | Session Manager | Менеджер управления жизненным циклом пользовательских сессий и cgroups. |
| KillUserProcesses | yes / no | Политика завершения всех фоновых процессов пользователя при закрытии сессии. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Сокращение глобального таймаута остановки до 10 секунд
Уменьшите максимальное время ожидания зависших процессов в /etc/systemd/system.conf:
# Отредактируйте общесистемную конфигурацию systemd:
sudo sed -i 's/#DefaultTimeoutStopSec=90s/DefaultTimeoutStopSec=10s/' /etc/systemd/system.conf
sudo sed -i 's/#DefaultTimeoutAbortSec=90s/DefaultTimeoutAbortSec=10s/' /etc/systemd/system.conf
# Примените изменения без перезагрузки:
sudo systemctl daemon-reexecСценарий 2: Принудительное завершение процессов пользователя в logind.conf
# Настройка автоматического закрытия всех процессов при логауте:
sudo sed -i 's/#KillUserProcesses=no/KillUserProcesses=yes/' /etc/systemd/logind.conf
# Перезапуск службы logind:
sudo systemctl restart systemd-logindСценарий 3: Локализация зависшего пользовательского сервиса
Определите, какие именно пользовательские процессы не реагируют на сигналы:
# Просмотр дерева процессов конкретной пользовательской сессии:
loginctl list-sessions
loginctl session-status <SESSION_ID>
# Просмотр запущенных сервисов пользователя:
systemctl --user list-units --type=service --state=runningСценарий 4: Экстренная мгновенная перезагрузка сервера через Magic SysRq
Если сервер намертво завис на этапе Stop Job прямо сейчас:
# Принудительный мгновенный сброс буферов и перезагрузка ядра:
echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-triggerITSTM настроит корректные цепочки graceful shutdown для сложных сервисов и исключит многоминутные простои оборудования.
Частые вопросы (FAQ)
Почему systemd ждет именно 90 секунд?
Значение 90 секунд заложено разработчиками systemd как безопасный интервал по умолчанию, чтобы базы данных (MySQL, PostgreSQL) успели корректно сбросить буферы транзакций на диск без повреждения данных.
Завершит ли KillUserProcesses=yes сессии tmux и screen?
Да. Если KillUserProcesses включен, systemd уничтожит все запущенные пользователем программы при выходе из SSH. Чтобы оставить фоновый процесс, используйте команду systemd-run --user --scope tmux.
Как задать индивидуальный таймаут остановки только для одного сервиса?
В секции [Service] unit-файла добавьте директиву TimeoutStopSec=15s.
Что означает статус stop-sigterm в выводе systemd?
Он означает, что systemd уже отправил процессу запрос на мягкое завершение (SIGTERM) и в данный момент ожидает его выхода по таймеру TimeoutStopSec.