Vlastný skript pri zatvorení veka notebooku a uzamknutí obrazovky bez spánku

Ahojte všetci. Na svojom domácom notebooku používam Lubuntu 18.04. Jedného krásneho dňa som sa rozhodol, že nie som spokojný s akciami, ktoré Power Manager ponúkal pri zatváraní veka notebooku. Chcel som zamknúť obrazovku pri zatváraní veka notebooku a po chvíli poslať notebook do hibernácie. Napísal som k tomu scenár a ponáhľam sa s vami oň podeliť.

Narazil som na dva problémy.

Po prvé, hibernácia v Lubunte nefunguje hneď po vybalení; ak ju chcete povoliť, musíte urobiť nasledovné.

Nájdite swap UUID, na to musíte spustiť:

grep swap /etc/fstab

V mojom prípade je výstup nasledovný:

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

Potom musíte pridať UUID do inicializačných parametrov jadra. Urobíte to tak, že do riadku „GRUB_CMDLINE_LINUX_DEFAULT“ v súbore /etc/default/grub pridáte restore=UUID=%vaše UUID%

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

A spustite príkaz:

sudo update-grub

Teraz by hibernácia mala fungovať, aby ste skontrolovali, či môžete spustiť:

sudo systemctl hibernate

Druhým problémom bolo, ako uzamknúť obrazovku používateľa ako root bez toho, aby sa prenosný počítač poslal do režimu spánku. Vyriešil som to pomocou dbus-send, samotný príkaz je v skripte nižšie. Ak niekto pozná iné možnosti, napíšte do komentárov

Teraz začnime písať scenár.

Prvá vec, ktorú musíme urobiť v Power Manager, je vybrať možnosť Vypnúť displej ako akciu pri zatváraní veka, aby nedochádzalo ku konfliktom s naším skriptom.

Vlastný skript pri zatvorení veka notebooku a uzamknutí obrazovky bez spánku

Potom vytvorte súbor /etc/acpi/events/laptop-lid s nasledujúcim obsahom:

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

a vytvorte skript /etc/acpi/laptop-lid.sh s nasledujúcim obsahom:

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

Vytvorenie spustiteľného skriptu:

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

A reštartujte démona acpid, aby sa zmeny použili:

sudo systemctl restart acpid.service

Všetko je pripravené.

Pre Gnome v skripte musíte zmeniť:

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

Zdroj: hab.com

Pridať komentár