Кратко: причина почти всегда в том, что за «критический» уровень отвечает демон UPower / настройки окружения, а сам переход в гибернацию идёт через systemd-logind и сессийный менеджер Cinnamon. Если в системе есть «инхибиторы» (приложения, которые блокируют спящий режим) или сам Cinnamon пытается «правильно» завершить сеанс, то сначала произойдёт logout/зависание, а только потом — гибернация. Решение — настроить механизм реагирования на мало заряда (UPower или настройки Cinnamon) или запустить собственный корневой скрипт, который будет немедленно вызывать hibernate/poweroff.
Ниже — пошагово что проверить и как настроить.
1) Сначала проверьте, что гибернация вообще работает
- Выполните вручную:
sudo systemctl hibernate
(Если система не возвращается нормально, сначала настройте swap/resume — без этого hibernate бесполезна.)
2) Посмотрите, какие процессы/приложения блокируют переход в спящий режим
- Выполните:
systemd-inhibit --list
Если есть большие / долгие ингибиторы от приложений (например медиаплеер, браузер-плагин, менеджер сессий), именно они могут принуждать Cinnamon выйти из сеанса чтобы их убрать.
3) Настройте UPower (рекомендуемый способ)
- Откройте /etc/UPower/UPower.conf (под root).
- Примеры опций, на которые обратить внимание:
PercentageLow=10
PercentageCritical=3
PercentageAction=2
CriticalPowerAction=Hibernate # или PowerOff
- Установите CriticalPowerAction=Hibernate или =PowerOff в зависимости от желаемого поведения.
- Сохраните файл и перезапустите upower:
sudo systemctl restart upower
- Посмотреть текущие пороги:
upower --dump
UPower вызовет действие на уровне системы при достижении порога. Это самый «правильный» путь — DE не должен при этом сначала выкидывать пользователя, если нет ингибиторов.
4) Проверьте/измените настройки Cinnamon
В Cinnamon есть собственные параметры питания, которые могут управлять критическим уровнем:
- Через GUI: System Settings → Power → при критическом заряде выбрать Hibernate или Shut down
- Или через gsettings/dconf (если ключи присутствуют):
gsettings get org.cinnamon.settings-daemon.plugins.power critical-battery-action
gsettings set org.cinnamon.settings-daemon.plugins.power critical-battery-action 'hibernate'
(Названия ключей могут немного отличаться по версиям — при отсутствии ключа смотрите dconf-editor или man страницы Cinnamon.)
5) Если ингибиторы мешают — либо отключите их, либо заставьте действие выполнять root-скрипт
Если невозможно убрать ингибиторы, можно запустить «корневой» монитор, который будет проверять заряд и вызывать hibernate/poweroff от root, игнорируя GUI-инхибиторы.
Пример простого скрипта + systemd-timer:
- /usr/local/bin/battery-action (сделать executable):
#!/bin/bash
BAT=$(upower -e | grep -m1 BAT)
PERC=$(upower -i "$BAT" | awk -F: '/percentage/ {gsub(/%/,"",$2); print int($2); exit}')
if [ "$PERC" -le 3 ]; then
logger "Battery $PERC% <= 3%, hibernating"
/bin/systemctl hibernate
fi
- Юнит службы /etc/systemd/system/battery-action.service:
[Unit]
Description=Battery action (hibernate) service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/battery-action
User=root
- Таймер /etc/systemd/system/battery-action.timer:
[Unit]
Description=Run battery-action every minute
[Timer]
OnBootSec=1min
OnUnitActiveSec=1min
[Install]
WantedBy=timers.target
- Активировать:
sudo systemctl daemon-reload
sudo systemctl enable --now battery-action.timer
Этот подход даст «жёсткий» контроль: при достижении порога root выполнит systemctl hibernate (или systemctl poweroff), и окружение пользователя не успеет принудительно logout’нуться.
6) Дополнительные замечания
- Если вы хотите выключение вместо гибернации — используйте CriticalPowerAction=PowerOff в UPower.conf или выполняйте systemctl poweroff.
- Используйте аккуратные пороги (PercentageAction/PercentageCritical) чтобы не уводить ноутбук в гибернацию слишком рано.
- Всегда сначала тестируйте вручную systemctl hibernate/poweroff, чтобы убедиться, что восстановление/корректное выключение работает.
Если хотите, могу:
- Подсказать конкретные значения порогов;
- Привести точные команды для вашей версии Debian/Cinnamon (названия ключей dconf/gsettings могут отличаться);
- Помочь написать и протестировать скрипт по вашему оборудованию (пришлите вывод upower --dump и systemd-inhibit --list).