acpid (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи acpid. Дата последней синхронизации: 11 января 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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/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.

Смотрите также