Почему при низком заряде батареи в Debian с окружением Cinnamon система начинает тормозить перед переходом в гибернацию?

Привет! При низком заряде батареи ноутбук сначала выходит из системы (logout) и начинает зависать, а уже затем уходит в гибернацию. Как настроить устройство так, чтобы при малом заряде оно сразу переходило в гибернацию без этих лагов и выхода из сеанса? В крайнем случае пусть просто выключается.
  • 17 июня 2026 г. 18:00
Ответы на вопрос 3
Кратко: причина почти всегда в том, что за «критический» уровень отвечает демон 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).
если все управляется upower, смотри конфиг <br/> /etc/UPower/UPower.conf <br/> ищи (это порог, при котором принудительно выполнится CriticalPowerAction) он в процентах (нужно увеличить его) <br/> <code>PercentageAction=10</code> <br/> и соответственно действие: <br/> <code>CriticalPowerAction=Hibernate</code> <br/> следи что бы значения были одно больше другого (первые два - просто предупреждения) <br/> <pre><code>PercentageLow=20
PercentageCritical=15
PercentageAction=10</code></pre> <br/> применить настройки либо перезагрузкой ОС либо службы <br/> <code>sudo systemctl restart upower</code>
Для начала проверь, работает ли гибернация вообще: <code>sudo systemctl hibernate</code> . Если зависает или выдаёт ошибку — hibernate не настроен (нет swap/resume), и система пытается в него уйти, отсюда лаги. <br/> <br/> Если хочешь просто выключение — в <code>/etc/UPower/UPower.conf</code> поставь <code>CriticalPowerAction=PowerOff</code> и перезапусти: <code>sudo systemctl restart upower</code> .
Похожие вопросы