Benutzerdefiniertes Skript beim Schließen des Laptopdeckels und Sperren des Bildschirms ohne Ruhezustand

Hallo zusammen. Ich verwende Lubuntu 18.04 auf meinem Heimlaptop. Eines schönen Tages beschloss ich, dass ich mit den Aktionen, die Power Manager beim Schließen des Laptopdeckels bot, nicht zufrieden war. Ich wollte den Bildschirm beim Schließen des Laptopdeckels sperren und den Laptop nach einer Weile in den Ruhezustand versetzen. Ich habe dafür ein Skript geschrieben und beeile mich, es mit Ihnen zu teilen.

Ich bin auf zwei Probleme gestoßen.

Erstens funktioniert der Ruhezustand in Lubunta nicht sofort. Um ihn zu aktivieren, müssen Sie Folgendes tun.

Suchen Sie den UUID-Swap. Dazu müssen Sie Folgendes ausführen:

grep swap /etc/fstab

In meinem Fall ist die Ausgabe folgende:

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

Anschließend müssen Sie die UUID zu den Kernel-Initialisierungsparametern hinzufügen. Fügen Sie dazu „resume=UUID=%your UUID%“ zur Zeile „GRUB_CMDLINE_LINUX_DEFAULT“ in der Datei /etc/default/grub hinzu

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

Und führen Sie den Befehl aus:

sudo update-grub

Jetzt sollte der Ruhezustand funktionieren. Zur Überprüfung können Sie Folgendes ausführen:

sudo systemctl hibernate

Das zweite Problem bestand darin, den Bildschirm des Benutzers als Root zu sperren, ohne den Laptop in den Ruhezustand zu versetzen. Ich habe es mit dbus-send gelöst, der Befehl selbst ist im Skript unten. Wenn jemand andere Möglichkeiten kennt, schreibt es bitte in die Kommentare

Beginnen wir nun mit dem Schreiben des Skripts.

Als erstes müssen wir im Power Manager als Aktion beim Schließen des Deckels Display ausschalten auswählen, damit es zu keinen Konflikten mit unserem Skript kommt.

Benutzerdefiniertes Skript beim Schließen des Laptopdeckels und Sperren des Bildschirms ohne Ruhezustand

Anschließend erstellen Sie eine Datei /etc/acpi/events/laptop-lid mit folgendem Inhalt:

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

und erstellen Sie ein Skript /etc/acpi/laptop-lid.sh mit folgendem Inhalt:

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

Das Skript ausführbar machen:

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

Und starten Sie den acpid-Daemon neu, damit die Änderungen übernommen werden:

sudo systemctl restart acpid.service

Alles ist fertig.

Für Gnome im Skript müssen Sie Folgendes ändern:

  • lxsessin => Gnome-Sitzung
  • org.freedesktop.ScreenSaver => org.gnome.ScreenSaver

Source: habr.com

Kommentar hinzufügen