ΠšΠ°ΡΡ‚ΠΎΠΌΠ½Ρ‹ΠΉ скрипт ΠΏΡ€ΠΈ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΊΡ€Ρ‹ΡˆΠΊΠΈ Π½ΠΎΡƒΡ‚Π±ΡƒΠΊΠ° ΠΈ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠ° экрана Π±Π΅Π· сна

ВсСм ΠΏΡ€ΠΈΠ²Π΅Ρ‚. Π― ΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡΡŒ 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