Jump to content
ArchWiki

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/sh
acpi_listen | while read -r event; do
 handler.sh "$event"
done

Где handler.sh может быть скриптом, подобным /etc/acpi/handler.sh.

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

AltStyle によって変換されたページ (->オリジナル) /