Кастомны скрыпт пры зачыненні вечка наўтбука і блакіроўка экрана без сну

Ўсім прывітанне. Я карыстаюся Lubuntu 18.04/XNUMX на сваім хатнім ноўтбуку. У адзін выдатны дзень я вырашыў, што мяне не ўладкоўваюць дзеянні якія прапануе 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

Дадаць каментар