Skript po meri pri zapiranju pokrova prenosnika in zaklepanju zaslona brez spanja

Pozdravljeni vsi skupaj. Na domačem prenosnem računalniku uporabljam Lubuntu 18.04. Nekega lepega dne sem se odločil, da nisem zadovoljen z dejanji, ki jih ponuja Power Manager ob zapiranju pokrova prenosnika. Želel sem zakleniti zaslon ob zapiranju pokrova prenosnika in čez nekaj časa poslati prenosnik v mirovanje. Za to sem napisal scenarij in ga hitim deliti z vami.

Naletel sem na dve težavi.

Prvič, mirovanje ne deluje takoj v Lubunti; če ga želite omogočiti, morate narediti naslednje.

Poiščite zamenjavo UUID, za to morate zagnati:

grep swap /etc/fstab

V mojem primeru je rezultat naslednji:

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

Nato morate parametrom inicializacije jedra dodati UUID. Če želite to narediti, dodajte resume=UUID=%vaš UUID% v vrstico “GRUB_CMDLINE_LINUX_DEFAULT” v datoteki /etc/default/grub

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

In zaženite ukaz:

sudo update-grub

Zdaj mora mirovanje delovati, da preverite, lahko zaženete:

sudo systemctl hibernate

Druga težava je bila, kako zakleniti uporabnikov zaslon kot root, ne da bi prenosnik poslal v stanje spanja. Rešil sem z uporabo dbus-send, sam ukaz je v skriptu spodaj. Če kdo pozna druge možnosti, naj napiše v komentar

Zdaj pa začnimo pisati scenarij.

Prva stvar, ki jo moramo narediti v Power Managerju, je, da kot dejanje ob zapiranju pokrova izberemo Izklopi zaslon, da ne pride do konfliktov z našim skriptom.

Skript po meri pri zapiranju pokrova prenosnika in zaklepanju zaslona brez spanja

Nato ustvarite datoteko /etc/acpi/events/laptop-lid z naslednjo vsebino:

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

in ustvarite skript /etc/acpi/laptop-lid.sh z naslednjo vsebino:

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

Naredite skript izvršljiv:

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

In znova zaženite demon acpid, da bodo spremembe uporabljene:

sudo systemctl restart acpid.service

Vse je pripravljeno.

Za Gnome v skriptu morate spremeniti:

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

Vir: www.habr.com

Dodaj komentar