acpid (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
acpid
. Дата последней синхронизации: 11 января 2022. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
ACPI modules
DSDT
acpid2
— это гибкий и расширяемый демон для доставки событий ACPI. Когда происходит событие, демон запускает программы для его обработки. Эти события запускаются определёнными действиями, такими как:
Нажатие специальных кнопок, включая кнопки выключения и сна
Закрытие крышки ноутбука
Подключение или отключение внешнего питания ноутбука
Подключение или отключение наушников и т.д.
Примечание
Окружения рабочего стола
, такие как
GNOME
, менеджер входа
systemd
и демоны
обработки дополнительных клавиш
могут реализовывать собственные схемы обработки событий, независимые от acpid. Одновременный запуск нескольких систем может приводить к неожиданному поведению, такому как двойному уходу в ждущий режим после нажатия кнопки сна. Вы должны помнить об этом и включать только желаемые обработчики.
Установка
Установите
пакет
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
Сделайте скрипт
исполняемым
и
перезагрузите
службу
acpid.service
, чтобы она прочла и применила изменения в этих файлах.
Советы и рекомендации
Примечание
Некоторые из описанных здесь действий, такие как переключение Wi-Fi и управление подсветкой, уже могут обрабатываться непосредственно драйвером. Сверьтесь с документацией соответствующих модулей ядра.
Примеры событий
Ниже приведены примеры событий, которые можно использовать в скрипте
/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+
Примечание
Эти команды могут не работать как задумано с PulseAudio.
[1]
Для полноценной работы запускайте команды от имени текущего пользователя, указав
переменную окружения
XDG_RUNTIME_DIR
, например
sudo -u
пользователь
XDG_RUNTIME_DIR=/run/user/
1000
pactl
.
Совет
Отключите или привяжите кнопки громкости в Xorg, чтобы предотвратить конфликты с другими приложениями. Смотрите
xmodmap (Русский)
для подробностей.
Смотрите также
[2]
.
Включение управления подсветкой
Можно настроить управление яркостью экрана аналогичным образом. Напишите примерно такой скрипт-обработчик:
/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-серверу, экрану и устройствам ввода.
Смотрите
[3]
как пример функции при использовании
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/sh

acpi_listen | while read -r event; do
handler.sh
"$event"
done
Где
handler.sh
может быть скриптом, подобным
/etc/acpi/handler.sh
.
Смотрите также
домашняя страница acpid
Gentoo:ACPI#Configuration