acpid (Русский)

From ArchWiki
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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

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

Сделайте скрипт выполняемым:

# chmod +x /etc/acpi/actions/sleep-button.sh

Затем перезагрузите службу 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 (Русский) для подробностей.

Включение управления подсветкой

Можно настроить управление яркостью экрана аналогичным образом. Напишите примерно такой скрипт-обработчик:

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

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