Выключение ноутбука при закрытии крышки в Arch Linux

Вместо вступления
Я искренне надеюсь, что эта статья потеряет свою актуальность, и у вас всё заработает как надо без приёмов, которые я сейчас опишу. Если у вас всё работает - я за вас искренне рад.
----
Сегодня мне понадобилось перенастроить закрытие крышки ноутбука на выключение ОС. Причина этому банальна - некоторые домочадцы повадились разряжать батарею почти до предела и загонять ноут в таком состоянии в сон закрытием крышки. Естественно, батарея разряжается до конца, и ОС оказывается выключенной нештатно. ОС - это Arch Linux с systemd, версии 217, и этот самый systemd в теории должен обыграть нужную мне ситуацию. Но это в теории, а на практике всё оказалось иначе.

Итак, в конфигурационном файле /etc/systemd/logind.conf есть строчки, которые определяют, что будет происходить при закрытии крышки. Они по-умолчанию закомментированы, и systemd выполняет suspend системы(это отлично работает, да):

#HandleLidSwitch=suspend
#HandleLidSwitchDocked=ignore

Для выключения системы при закрытии крышки ноута нужно их раскомметировать и написать poweroff в обоих строчках:

HandleLidSwitch=poweroff
HandleLidSwitchDocked=poweroff

Однако ж, работает сиё через раз, то выключается - то нет, и выявить какую-либо закономерность в происходящем мракобесии я не смог. При этом в логах я вижу, что systemd "понял", что крышка закрылась и открылась.
Гугл подсказал, что схожая ситуация была как раз со сном, Suspend не срабатывал при закрытии крышки. Что ж, одно исправили - другое сломали, видимо, поэтому для решения моей проблемы я делегировал обработку закрытой крышки приложению acpid2.
Поставим и включим его:

#pacman -S acpid
#systemctl enable acpid.service
#systemctl start acpid.service

Теперь посмотрим, какой скрипт будет выполняться для события закрытой крышки, узнать это можно, пройдя в папку /etc/acpi/events - нужный нам файл будет содержать в названии -lid-.
В моём случае файл назывался a-lid-aticonfig.
В нём был прописан запуск скрипта /etc/acpi/ati-powermode.sh

Вот в этот скрипт я и внёс команду завершения работы ОС:

grep -q closed /proc/acpi/button/lid/*/state
if [ $? = 0 ]; then
 lid_closed=1
 echo "Lid Closed"
 systemctl -i poweroff
else
 lid_closed=0
 echo "Lid Open"
fi

exit

exit - потому что всё, что ниже, мне уже не требуется.

Осталось только выключить обработку события закрытия крышки в systemd. Подправим строчки в /etc/systemd/logind.conf

HandleLidSwitch=ignore
HandleLidSwitchDocked=ignore
LidSwitchIgnoreInhibited=no

И перезагрузим систему.

Теперь при закрытии крышки ноутбука он выключается, и насилие над батареей и ОС в какой-то степени прекратится.

💡Узнавайте о новых статьях быстрее. Подпишитесь на наши каналы в Telegram и Twitter.

Судя по тому, что вы читаете этот текст, вы дочитали эту статью до конца. Если она вам понравилась, поделитесь, пожалуйста, с помощью кнопок ниже. Спасибо за вашу поддержку!

Автор: Сергей Ткаченко

Сергей Ткаченко создал этот сайт в далёком 2009 году, и с тех пор продолжает над ним работать, публикуя новые материалы о Windows и её приложениях практически каждый день.

css.php