Jump to content

# acpid (Русский)

From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи 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

Category:

- Power management (Русский)

acpid (Русский)
Add topic