Вместо вступления
Я искренне надеюсь, что эта статья потеряет свою актуальность, и у вас всё заработает как надо без приёмов, которые я сейчас опишу. Если у вас всё работает - я за вас искренне рад.
----
Сегодня мне понадобилось перенастроить закрытие крышки ноутбука на выключение ОС. Причина этому банальна - некоторые домочадцы повадились разряжать батарею почти до предела и загонять ноут в таком состоянии в сон закрытием крышки. Естественно, батарея разряжается до конца, и ОС оказывается выключенной нештатно. ОС - это 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.