Niestandardowy skrypt podczas zamykania pokrywy laptopa i blokowania ekranu bez uśpienia

Cześć wszystkim. Używam Lubuntu 18.04 na moim domowym laptopie. Pewnego pięknego dnia stwierdziłem, że nie jestem zadowolony z działań, jakie oferuje Power Manager przy zamykaniu pokrywy laptopa. Chciałem zablokować ekran podczas zamykania pokrywy laptopa i zahibernować laptopa po chwili. W tym celu napisałem scenariusz i spieszę się nim z wami podzielić.

Natknąłem się na dwa problemy.

Po pierwsze, hibernacja nie działa od razu w Lubunt, aby ją włączyć, musisz wykonać następujące czynności.

Znajdź wymianę UUID, w tym celu musisz uruchomić:

grep swap /etc/fstab

W moim przypadku dane wyjściowe są następujące:

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

Następnie musisz dodać UUID do parametrów inicjalizacji jądra. Aby to zrobić, dodaj CV=UUID=%twój UUID% do wiersza „GRUB_CMDLINE_LINUX_DEFAULT” w pliku /etc/default/grub

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

I uruchom polecenie:

sudo update-grub

Teraz hibernacja powinna działać, aby sprawdzić, czy możesz uruchomić:

sudo systemctl hibernate

Drugi problem polegał na tym, jak zablokować ekran użytkownika przed root'a bez wysyłania laptopa w stan uśpienia. Rozwiązałem to za pomocą dbus-send, samo polecenie znajduje się w skrypcie poniżej. Jeśli ktoś zna inne opcje, proszę pisać w komentarzach.

Teraz zacznijmy pisać scenariusz.

Pierwszą rzeczą, którą musimy zrobić w Power Managerze, jest wybranie opcji Wyłącz wyświetlacz jako akcję, gdy pokrywa jest zamknięta, aby nie było konfliktów z naszym skryptem.

Niestandardowy skrypt podczas zamykania pokrywy laptopa i blokowania ekranu bez uśpienia

Następnie tworzymy plik /etc/acpi/events/laptop-lid o następującej treści:

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

i utwórz skrypt /etc/acpi/laptop-lid.sh o następującej treści:

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

Uczynienie skryptu wykonywalnym:

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

I zrestartuj demona accid, aby zmiany odniosły skutek:

sudo systemctl restart acpid.service

Wszystko gotowe.

Dla Gnome w skrypcie musisz zmienić:

  • lxsessin => sesja gnome
  • org.freedesktop.ScreenSaver => org.gnome.ScreenSaver

Źródło: www.habr.com

Dodaj komentarz