Всім привіт. Я користуюсь Lubuntu 18.04 на своєму домашньому ноутбуці. Одного дня я вирішив, що мене не влаштовують дії, які пропонує Power Manager при закритті кришки ноутбука. Я хотів при закритті кришки ноутбука блокувати екран і через деякий час відправляти ноутбук до глибокого сну. Для цього я написав скрипт і поспішаю їм з вами поділитися.
Я зіткнувся із двома проблемами.
Перша — у лубунті з коробки не працює глибокий сну, для її включення необхідно зробити наступне.
Знайти 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
Джерело: habr.com