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

  • Tutorial
Всем привет. Я пользуюсь 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 (выключить экран) как действие при закрытии крышки, чтобы не было конфликтов с нашим скриптом.

image

Потом создаем файл /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
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 7

    +1
    Я бы заменил ифтены на это:
    замена
    check_lid && sudo -u $USER -E dbus-send \
                      --bus=$BUS --type=method_call \
    		  --dest="org.freedesktop.ScreenSaver" \
    		  "/org/freedesktop/ScreenSaver" \
    		  org.freedesktop.ScreenSaver.Lock
    ...
    
    check_lid && systemctl hibernate

      0
      Спасибо за идею
      +2
      Когда-то мне такое было очень нужно. Сейчас уже есть скрипт решающий такую задачу в дистрибутиве ubuntu и называется suspendthenhibernate. Настраивается легко. При переходе в ждущий режим (в том числе по закрытии крышки), через указаное время просыпается и переходит в гибернацию (у меня это 3 часа). Имхо это куда лучше чем ему работать какое-то время в фоне (например, в рюкзаке).

      Кстати, в kde plasma 5.17 уже есть gui для настройки suspendthenhibernate. Но я не пробовал, у меня 5.16 и меня устроил вариант через консоль сделать единожды и больше об этом не думать.
      Настраивал
        +1
        Незнал про этот скрипт, спасибо
        0

        А если закрыть, открыть и через 9 минут опять закрыть крышку, ноутбук уснет через 1 или 10 минут?

          0
          Через 1
          +1
          Здорово, но уже все сделано за нас, независимо от используемого дистрибутива и десктоп-окружения: man logind.conf(5), systemd-sleep.conf(5). Хотя раньше варианта настройки "suspend-then-hibernate" не было.

          Only users with full accounts can post comments. Log in, please.