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.
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