Vlastní skript při zavírání víka notebooku a zamykání obrazovky bez spánku

Ahoj všichni. Na domácím notebooku používám Lubuntu 18.04. Jednoho krásného dne jsem se rozhodl, že nejsem spokojen s akcemi, které Power Manager nabízel při zavírání víka notebooku. Chtěl jsem zamknout obrazovku při zavírání víka notebooku a po chvíli poslat notebook do hibernace. Napsal jsem k tomu scénář a spěchám se o něj s vámi podělit.

Narazil jsem na dva problémy.

Za prvé, hibernace v Lubuntě nefunguje hned po vybalení; pro její aktivaci je třeba provést následující.

Najděte swap UUID, k tomu musíte spustit:

grep swap /etc/fstab

V mém případě je výstup následující:

# swap was on /dev/mmcblk0p2 during installation
UUID=aebf757e-14c0-410a-b042-3d9a6044a987 none            swap    sw              0       0

Poté musíte přidat UUID do inicializačních parametrů jádra. Chcete-li to provést, přidejte restore=UUID=%vaše UUID% do řádku „GRUB_CMDLINE_LINUX_DEFAULT“ v souboru /etc/default/grub

...
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=aebf757e-14c0-410a-b042-3d9a6044a987"
...

A spusťte příkaz:

sudo update-grub

Nyní by hibernace měla fungovat, abyste ověřili, že můžete spustit:

sudo systemctl hibernate

Druhým problémem bylo, jak uzamknout obrazovku uživatele jako root, aniž by se notebook poslal do režimu spánku. Vyřešil jsem to pomocí dbus-send, samotný příkaz je ve skriptu níže. Pokud někdo zná další možnosti, napište do komentářů

Nyní začneme psát scénář.

První věc, kterou musíme v Power Manageru udělat, je vybrat jako akci při zavírání víka Vypnout displej, aby nedocházelo ke konfliktům s naším skriptem.

Vlastní skript při zavírání víka notebooku a zamykání obrazovky bez spánku

Poté vytvořte soubor /etc/acpi/events/laptop-lid s následujícím obsahem:

event=button/lid.*
action=/etc/acpi/laptop-lid.sh

a vytvořte skript /etc/acpi/laptop-lid.sh s následujícím obsahem:

#!/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

Vytvoření spustitelného skriptu:

sudo chmod a+x /etc/acpi/laptop-lid.sh

A restartujte démona acpid, aby se změny uplatnily:

sudo systemctl restart acpid.service

Všechno je připraveno.

Pro Gnome ve skriptu musíte změnit:

  • lxsessin => gnome-session
  • org.freedesktop.ScreenSaver => org.gnome.ScreenSaver

Zdroj: www.habr.com

Přidat komentář