acpid (Русский)
acpid2 — это гибкий и расширяемый демон для доставки событий ACPI. Когда происходит событие, демон запускает программы для его обработки. Эти события запускаются определёнными действиями, такими как:
- Нажатие специальных кнопок, включая кнопки выключения и сна
- Закрытие крышки ноутбука
- Подключение или отключение внешнего питания ноутбука
- Подключение или отключение наушников и т.д.
Установка
Установите пакет acpid. Затем запустите/включите службу acpid.service
.
Настройка
acpid поставляется с рядом предопределенных действий для событий, например для того, что должно произойти при нажатии кнопки питания. По умолчанию эти действия определены в файле /etc/acpi/handler.sh
, который выполняется после возникновения любого ACPI-события (как указано в /etc/acpi/events/anything
).
Ниже приводится краткий пример одного из таких действий. В этом случае при нажатии кнопки сна acpid запускает команду echo -n mem >/sys/power/state
, которая должна увести компьютер в ждущий режим:
button/sleep) case "$2" in SLPB) echo -n mem >/sys/power/state ;; *) logger "ACPI action undefined: $2" ;; esac ;;
К сожалению, не все компьютеры называют ACPI-события одинаково. Например, кнопка сна на одних компьютерах обозначается как SLPB, а на других как SBTN.
Чтобы узнать, как определяются ваши кнопки или Fn
сочетания клавиш, запустите просмотр журнала:
# journalctl -f
и затем понажимайте интересующие вас кнопки. В журнале должны появиться подобные записи:
logger: ACPI action undefined: PBTN logger: ACPI action undefined: SBTN
Если это не работает, запустите:
# acpi_listen
или с помощью openbsd-netcat:
$ netcat -U /var/run/acpid.socket
Затем нажмите кнопку питания, и вы увидите что-то такое:
button/power PBTN 00000000 00000b31
Вывод команды acpi_listen
отправляется /etc/acpi/handler.sh
в виде параметров $1, $2, $3 и $4.
Например:
$1 button/power $2 PBTN $3 00000000 $4 00000b31
Как вы могли заметить, в данном примере кнопка сна определилась как SBTN, а не как SLPB, прописанный по умолчанию в файле /etc/acpi/handler.sh
. Чтобы кнопка сна работала, может понадобиться исправить SLPB) на SBTN).
Базируясь на этой информации, вы можете легко изменить файл /etc/acpi/handler.sh
для выполнения различных команд в зависимости от запускаемых событий. Смотрите раздел #Советы и рекомендации ниже, чтобы узнать о других часто используемых командах.
Альтернативная настройка
По умолчанию все события ACPI проходят через скрипт /etc/acpi/handler.sh
. Это прописано в правиле /etc/acpi/events/anything
:
# Pass all events to our one handler script event=.* action=/etc/acpi/handler.sh %e
Хотя это нормально работает как есть, некоторые пользователи предпочитают разделить правила и действия на отдельные файлы. Следующий пример показывает, как можно как можно создать отдельный файл событий и соответствующий ему скрипт.
Будучи суперпользователем, создайте следюущий файл:
/etc/acpi/events/sleep-button
event=button sleep.* action=/etc/acpi/actions/sleep-button.sh %e
И скрипт:
/etc/acpi/actions/sleep-button.sh
#!/bin/sh case "$3" in SLPB) echo -n mem >/sys/power/state ;; *) logger "ACPI action undefined: $3" ;; esac
Сделайте скрипт выполняемым:
# chmod +x /etc/acpi/actions/sleep-button.sh
Затем перезагрузите службу acpid.service
, чтобы она прочла и применила изменения в этих файлах.
Советы и рекомендации
Примеры событий
Ниже приведены примеры событий, которые можно использовать в скрипте /etc/acpi/handler.sh
. Их следует адаптировать под ваше конкретное окружение, например изменить названия переменных, интерпретируемых acpi_listen
.
Для изменения яркости экрана ноутбука при подключении или отключении внешнего питания (числа может понадобиться поправить в соответствии с /sys/class/backlight/acpi_video0/max_brightness
):
ac_adapter) case "$2" in AC*|AD*) case "$4" in 00000000) echo -n 50 > /sys/class/backlight/acpi_video0/brightness ;; 00000001) echo -n 100 > /sys/class/backlight/acpi_video0/brightness ;; esac
Включение управления громкостью
Найдите acpi идентификаторы кнопок громкости (смотрите выше) и подставьте их в файлы ниже.
/etc/acpi/events/vol-d
event=button/volumedown action=amixer set Master 5-
/etc/acpi/events/vol-m
event=button/mute action=amixer set Master toggle
/etc/acpi/events/vol-u
event=button/volumeup action=amixer set Master 5+
XDG_RUNTIME_DIR
, например sudo -u пользователь XDG_RUNTIME_DIR=/run/user/1000 pactl
.Включение управления подсветкой
Можно настроить управление яркостью экрана аналогичным образом. Напишите примерно такой скрипт-обработчик:
/etc/acpi/handlers/bl
#!/bin/sh bl_dev=/sys/class/backlight/acpi_video0 step=1 case $1 in -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness;; +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness;; esac
и подключите его к ACPI событиям:
/etc/acpi/events/bl_d
event=video/brightnessdown action=/etc/acpi/handlers/bl -
/etc/acpi/events/bl_u
event=video/brightnessup action=/etc/acpi/handlers/bl +
Переключение Wi-Fi
Вы также можете создать простой переключатель питания Wi-Fi адаптера нажатием кнопки WLAN. Пример события:
/etc/acpi/events/wlan
event=button/wlan action=/etc/acpi/handlers/wlan
и его обработчик:
/etc/acpi/handlers/wlan
#!/bin/sh rf=/sys/class/rfkill/rfkill0 case $(< $rf/state) in 0) echo 1 >$rf/state;; 1) echo 0 >$rf/state;; esac
Получение имени пользователя текущего дисплея
Чтобы запускать команды, зависимые от Xorg, требуется определить X-дисплей и файл MIT magic cookie (через XAUTHORITY). Последний — это учётные данные безопасности, предстоавляющие доступ к X-серверу, экрану и устройствам ввода.
Смотрите [2] как пример функции при использовании xinitrc.
- Если подсветка экрана не отключается при закрытии крышни ноутбука, можно попробовать сделать это вручную путём запуска
getXuser xset dpms force off
иgetXuser xset dpms force on
при событиях открытия и закрытия крышки соответственно. Если дисплей погаснет, но подсветка останется включенной, используйте вместо этого vbetool с командамиvbetool dpms off
иvbetool dpms on
. Смотрите также XScreenSaver#Configuration. - При использовании who или w убедитесь, что
/run/utmp
создаётся при загрузке системы. Подробнее смотрите utmp(5).
Подключение к сокету acpid
В дополнение к файлам правил acpid принимает соединения по UNIX-сокету, по умолчанию /var/run/acpid.socket
. Пользовательские приложения могут подключаться к нему.
#!/bin/bash coproc acpi_listen trap 'kill $COPROC_PID' EXIT while read -u "${COPROC[0]}" -a event; do handler.sh "${event[@]}" done
Где handler.sh
может быть скриптом, подобным /etc/acpi/handler.sh
.