Кастомний скрипт при закритті кришки ноутбука та блокування екрану без сну

Всім привіт. Я користуюсь Lubuntu 18.04 на своєму домашньому ноутбуці. Одного дня я вирішив, що мене не влаштовують дії, які пропонує Power Manager при закритті кришки ноутбука. Я хотів при закритті кришки ноутбука блокувати екран і через деякий час відправляти ноутбук до глибокого сну. Для цього я написав скрипт і поспішаю їм з вами поділитися.

Я зіткнувся із двома проблемами.

Перша — у лубунті з коробки не працює глибокий сну, для її включення необхідно зробити наступне.

Знайти UUID swap, для цього потрібно виконати:

grep swap /etc/fstab

У моєму випадку висновок такий:

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

Потім необхідно додати UUID до параметрів ініціалізації ядра. Для цього потрібно у файлі /etc/default/grub дописати в рядок «GRUB_CMDLINE_LINUX_DEFAULT» resume=UUID=%ваш UUID%

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

І виконати команду:

sudo update-grub

Тепер гібернація має працювати, для перевірки можна виконати:

sudo systemctl hibernate

Друга проблема була з тим, як заблокувати екран користувача від root'а, не відправивши при цьому ноутбук у сон. Я вирішив її за допомогою dbus-send, сама команда у скрипті нижче. Якщо хтось знає інші варіанти, напишіть будь ласка в коментарях

Тепер почнемо написання скрипта.

Перше, що нам треба зробити в Power Manager, це вибрати Switch off display (вимкнути екран) як дію під час закриття кришки, щоб не було конфліктів із нашим скриптом.

Кастомний скрипт при закритті кришки ноутбука та блокування екрану без сну

Потім створюємо файл /etc/acpi/events/laptop-lid з таким вмістом:

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

і створюємо скрипт /etc/acpi/laptop-lid.sh з таким вмістом:

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

Робимо скрипт виконуваним:

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

І перезапускаємо демона acpid, щоб зміни застосувалися:

sudo systemctl restart acpid.service

Все готово.

Для Gnome у скрипті треба змінити:

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

Джерело: habr.com

Додати коментар або відгук