Linux завис при выключении? Решаем проблему за 5 минут
Вы нажимаете «Завершить работу», а ваш компьютер с Linux просто зависает, не реагируя на команды? Знакомая и крайне раздражающая ситуация. Эта проблема может застать врасплох даже опытного пользователя, заставляя вручную выдергивать шнур питания и рисковать потерей данных.
Чаще всего виновником является systemd — система инициализации, которая управляет всеми сервисами. Она терпеливо ждет, когда какой-то упрямый процесс завершит свою работу, и это ожидание может длиться вечно. По умолчанию система дает сервису полторы минуты, прежде чем применить силу, но таких «нарушителей» может быть несколько.
Не спешите паниковать или переустанавливать систему! Мы подготовили для вас пошаговое руководство, которое поможет диагностировать и навсегда решить эту проблему. Вы узнаете, как заставить систему показать, что именно мешает ей выключиться, и как быстро это исправить.
Мы рассмотрим три рабочих метода, от самого информативного до радикального. Вы научитесь читать логи выключения с помощью journalctl, даже если система их по умолчанию не сохраняет. Поймете, как отключить графическую заставку, чтобы в реальном времени видеть, на каком этапе происходит сбой.
А если виноват неуловимый баг, мы покажем, как безопасно сократить время ожидания до 5 секунд, чтобы ваш ПК выключался практически мгновенно. Готовы навсегда покончить с зависаниями? Тогда переходите к полной статье и верните себе контроль над своей системой!
Сразу после установки, как правило, любая операционная система будет работать очень хорошо и быстро. Но со временем ошибки могут накапливаться и вызывать различные проблемы с использованием ОС.
В сегодняшней статье мы рассмотрим такую ошибку, как "не выключается Linux". Разберём, почему может возникнуть такая проблема, методы её отладки и исправления.
Содержание статьи
Почему не выключается компьютер Linux?
Инициализацией и завершением работы сервисов в системе Linux занимается system, и если компьютер не может выключиться, это означает, что systemd не может справиться с каким-либо процессом и ждёт его завершения. По умолчанию система даёт каждому сервису одну минуту и тридцать секунд, а затем отправляет сигнал экстренного завершения. Но таких сервисов может быть несколько, и завершение работы Linux может затянуться.
Есть несколько путей решения этой проблемы:
- Во первых, нам необходимо понять в чём именно проблема, какой сервис её вызывает и попытаться её решить;
- Во вторых, мы можем уменьшить время ожидания от 90 до пяти секунд, для большинства сервисов этого будет вполне достаточно.
А теперь давайте рассмотрим пути решения проблемы.
Как исправить ошибку "не выключается Linux"
Чтобы понять, почему система не может выключиться, нам сначала необходимо посмотреть лог её выключения. И тут у нас тоже есть два пути: либо отключить заставку и выводить лог в реальном времени, либо записывать лог выключения с помощью journalctl.
1. Лог выключения в реальном времени
Первый способ не настолько информативный, но всё же может быть полезным. Для отключения заставки откройте /etc/default/grub и в строке GRUB_CMDLINE_LINUX_DEFAULT замените слова quiet splash на verbose:
$ vi /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="verbose"
Выполите:
sudo update-grub
Затем перезагрузите компьютер. Сначала вы будете видеть полный лог загрузки, а при выключении вы увидите полный лог выключения. Преимущество этого пути в том, что вы увидите, на какой команде загрузка зависает, и сможете понять, куда копать дальше. Например, часто бывает, что Linux не может выключиться из-за ошибки "a stop job is running for Session c2 of user", т.е. мы не можем завершить сессию пользователя. Ещё выключению могут препятствовать примонтированные удалённые файловые системы.
2. Лог выключения в journalctl
Утилита journalctl занимается обработкой логов в Linux, но есть одна проблема: она записывает журналы только из текущей сессии, при перезагрузке всё стирается. Но это можно исправить. Для этого окройте конфигурационный файл /etc/systemd/journald.conf и замените в нём значение строки Storage=auto на Storage=persistent:
vi /etc/systemd/journald.conf
Storage=persistent
Затем два раза перезапустите компьютер. Первый раз мы перезапускаем, чтобы настройки логирования вступили в силу, а второй, чтобы собрать лог последнего выключения Linux. После того, как загрузка завершиться, вы можете посмотреть лог с помощью такой команды:
sudo journalctl -b -1 -n300
Опция -b позволяет вывести лог загрузки, -1 говорит, что нужно брать не текущую загрузку, а предыдущую, а -n300 отображает только последние 300 строк. Здесь вы можете видеть, что по таймауту была завершена именно сессия session-c1. Мы можем отфильтровать сообщения только по ней:
sudo journalctl -b -1 -u session-c1.scope
Если вы увидели ошибку и смогли её решить, то ваша система будет выключаться уже мгновенно, если же нет, то всё ещё есть несколько путей решения.
3. Настройка таймаутов в systemd
Если никакое из предыдущих решение не помогло, и в системе просто баг, который не позволяет ей адекватно выключиться, то вы всё ещё можете уменьшить время ожидания до того, как процессу будет отправлен сигнал экстренного завершения. Для этого откройте файл /etc/systemd/system.conf и добавьте туда такие строки:
sudo vi /etc/systemd/system.conf
DefaultTimeoutStartSec=05s
DefaultTimeoutStopSec=05s
Теперь система будет ждать только 5 секунд перед тем, как завершить проблемный процесс. Также на некоторых форумах рекомендуют установить сервис watchdog, чтобы он следил за правильностью работы системного таймера. Это тоже делается очень просто:
sudo apt install watchdog
sudo systemctl enable watchdog
sudo systemctl start watchdog
Выводы
Может быть огромное количество причин, по которым ваша система не сможет включиться, и чтобы их найти и исправить, необходимо анализировать логи, искать по форумах и настраивать свою систему. Надеюсь, информация из этой статьи сделает вашу работу в Linux более комфортной.