Я столкнулся с двумя проблемами.
Первая — в лубунте из коробки не работает гибернация, для ее включения необходимо сделать следующее.
Найти UUID swap, для этого нужно выполнить:
grep swap /etc/fstab
В моем случае вывод следующий:
# swap was on /dev/mmcblk0p2 during installation UUID=aebf757e-14c0-410a-b042-3d9a6044a987 none swap sw 0 0
Потом необходимо добавить UUID в параметры инициализации ядра. Для этого надо в файле /etc/default/grub дописать в строку «GRUB_CMDLINE_LINUX_DEFAULT» resume=UUID=%ваш UUID%
... GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=aebf757e-14c0-410a-b042-3d9a6044a987" ...
И выполнить команду:
sudo update-grub
Теперь гибернация должна работать, для проверки можно выполнить:
sudo systemctl hibernate
Вторая проблема была с тем, как заблокировать экран пользователя от root’а, не отправив при этом ноутбук в сон. Я решил ее с помощью dbus-send, сама команда в скрипте ниже. Если кто то знает другие варианты, напишите пожалуйста в комментариях
Теперь приступим к написанию скрипта.
Первое, что нам надо сделать в Power Manager, это выбрать Switch off display (выключить экран) как действие при закрытии крышки, чтобы не было конфликтов с нашим скриптом.

Потом создаем файл /etc/acpi/events/laptop-lid со следующим содержимым:
event=button/lid.* action=/etc/acpi/laptop-lid.sh
и создаем скрипт /etc/acpi/laptop-lid.sh со следующим содержимым:
#!/bin/bash #set variables #Получаем BUS адрес из environ файла процесса lxsession BUS=$(grep -z DBUS_SESSION_BUS_ADDRESS \ /proc/$(pidof -s lxsession)/environ | \ sed 's/DBUS_SESSION_BUS_ADDRESS=//g') #Из того же файла получаем юзера, которому принадлежит этот процесс USER=$(grep -z USER /proc/$(pidof -s lxsession)/environ | sed 's/USER=//g') #путь до стейт файла крышки ноутбука LID="/proc/acpi/button/lid/LID0/state" #Check lid state (return 0 if closed) check_lid () { grep -q closed $LID } #Lock screen without sleep check_lid if [ $? = 0 ] then #TODO run command as root sudo -u $USER -E dbus-send --bus=$BUS \ --type=method_call \ --dest="org.freedesktop.ScreenSaver" \ "/org/freedesktop/ScreenSaver" \ org.freedesktop.ScreenSaver.Lock fi #Wait 10 minutes and hibernate if lid is closed sleep 600 check_lid if [ $? = 0 ] then systemctl hibernate fi
Делаем скрипт исполняемым:
sudo chmod a+x /etc/acpi/laptop-lid.sh
И перезапускаем демона acpid, для того чтобы изменения применились:
sudo systemctl restart acpid.service
Все готово.
Для Gnome в скрипте надо поменять:
- lxsessin => gnome-session
- org.freedesktop.ScreenSaver => org.gnome.ScreenSaver
ссылка на оригинал статьи https://habr.com/ru/post/491486/
Добавить комментарий