acpid (Español)
acpid2 es un demonio flexible y extensible para entregar eventos ACPI. Cuando ocurre un evento, ejecuta programas para manejarlo. Estos eventos son desencadenados por ciertas acciones, tales como:
- Presionando teclas especiales, incluido el botón de Encendido/Suspensión/Hibernación
- Cerrando la tapa de un portátil
- (Des)Enchufando un adaptador de corriente de un portátil
- (Des)Enchufando el conector del teléfono (módem), etc.
Instalación
Instale el paquete acpid. Entonces inicie/active acpid.service
.
Configuración
acpid viene con una serie de acciones predefinidas para eventos activados, como lo que debería suceder cuando presionas el botón de encendido en tu máquina. De forma predeterminada, estas acciones se definen en /etc/acpi/handler.sh
, que se ejecuta después de detectar cualquier evento ACPI (según lo determinado por /etc/acpi/events/anything
)
Lo siguiente es un pequeño ejemplo de una acción de este tipo. En este caso, cuando se presiona el botón de Suspensión, acpid ejecuta la orden echo -n mem >/sys/power/state
que debería colocar la computadora en un estado de suspensión (hibernación):
button/sleep) case "$2" in SLPB) echo -n mem >/sys/power/state ;; *) logger "ACPI action undefined: $2" ;; esac ;;
Desafortunadamente, no todas las computadoras etiquetan los eventos ACPI de la misma manera. Por ejemplo, el botón de suspensión puede identificarse en una máquina como SLPB y en otra como SBTN.
Para determinar cómo se reconocen sus botones o atajos Fn
, ejecute la siguiente orden:
# journalctl -f
Ahora presione el botón de encendido y/o el botón de suspensión (por ejemplo, Fn+Esc
) en su máquina. El resultado debería ser algo así:
logger: ACPI action undefined: PBTN logger: ACPI action undefined: SBTN
Si eso no funciona, ejecute:
# acpi_listen
o con openbsd-netcat:
$ netcat -U /var/run/acpid.socket
Luego presione el botón de encendido y verá algo como esto:
button/power PBTN 00000000 00000b31
El resultado de acpi_listen
se envía a /etc/acpi/handler.sh
como parámetros $1, $2, $3 y $4.
Ejemplo:
$1 button/power $2 PBTN $3 00000000 $4 00000b31
Como habrá notado, el botón de suspensión en la salida del ejemplo se reconoce realmente como SBTN, en lugar de la etiqueta SLPB especificada en el archivo /etc/acpi/handler.sh
predeterminado. Para que la función de suspensión funcione correctamente en esta máquina, debería reemplazar SLPB) por SBTN).
Al utilizar esta información como base, puede personalizar fácilmente el archivo /etc/acpi/handler.sh
para ejecutar una variedad de órdenes según el evento que se active. Véase la sección #Consejos y trucos a continuación para conocer otras órdenes usadas comúnmente.
button/power
, button/lid
, button/suspend
y button/hibernate
son gestionados por systemd-logind.service(8) de forma predeterminada, véase Power management (Español)#Eventos de ACPI. Si se gestionan estos eventos con acpid, la gestión de estos eventos por logind debe desactivarse primero o inhibirse.Configuración alternativa
De manera predeterminada, todos los eventos ACPI se pasan a través del script /etc/acpi/handler.sh
. Esto se debe al conjunto de reglas descrito en /etc/acpi/events/anything
:
# Pasar todos los eventos a nuestro script de un solo controlador event=.* action=/etc/acpi/handler.sh %e
Si bien esto funciona bien, algunos usuarios pueden preferir definir reglas y acciones de eventos en sus propios script independientes. El siguiente es un ejemplo de como usar un archivo de evento individual y el script de acción correspondiente:
Como superusuario, cree los siguientes archivos:
/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
Haga el script ejecutable y recargue acpid.service
para que acpid reconozca los cambios en estos archivos.
Al usar este método, es fácil crear cualquier cantidad de scripts de eventos/acciones individuales.
Consejos y trucos
Eventos de ejemplo
Los siguientes son ejemplos de eventos que se pueden usar en el script /etc/acpi/handler.sh
. Estos ejemplos se deben modificar para que se ajusten a su entorno específico, por ejemplo cambiando los nombres de las variables de evento interpretados por acpi_listen
.
Para configurar el brillo de la pantalla del portátil cuando esté o no enchufado (es posible que sea necesario ajustar los números, véase /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
Activar el control del volumen
Averigüe la identidad acpi de los botones de volumen (véase arriba) y sustitúyalos por los eventos acpi en los archivos a continuación.
/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+
XDG_RUNTIME_DIR
, por ejemplo con:
# sudo -u usuario XDG_RUNTIME_DIR=/run/user/1000 pactl
Véase también [2].
Activar el control del brillo
De forma similar al control de volumen, acpid también le permite controlar el brillo de la pantalla. Para lograr esto, escriba algún controlador, como este:
/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
y nuevamente, conecte las teclas a los eventos 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 +
Activar el control Wi-Fi
También puede crear un interruptor de alimentación de la red inalámbrica simple al presionar el botón WLAN. Un ejemplo de evento:
/etc/acpi/events/wlan
event=button/wlan action=/etc/acpi/handlers/wlan
y su controlador:
/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
Obtener el nombre de usuario de la pantalla actual
Para ejecutar órdenes que dependan de Xorg, es necesario definir la visualización X así como el archivo MIT Magic Cookie (a través de XAUTHORITY). Después es tener una credencial de seguridad que proporciona acceso de lectura y escritura al servidor X, a la pantalla y a cualquier dispositivo de entrada (Véase xauth(1)).
Véase [3] para una función de ejemplo cuando se usa xinitrc.
- Si la luz de fondo de la pantalla LCD no se apaga cuando la tapa está cerrada, puede hacerlo manualmente ejecutando
getXuser xset dpms force off
ygetXuser xset dpms force on
en los eventos de tapa cerrada y abierta respectivamente. Si la pantalla está en blanco pero la luz de fondo encendida, en su lugar utilice vbetool conbetool dpms off
yvbetool dpms on
. Véase también Configuración de XScreenSaver. - Cuando utilice who o w, asegúrese de que se cree
/run/utmp
en el momento del arranque. Véase utmp(5) para más detalles.
Conectar a un socket acpid
Además de los archivos de reglas, acpid acepta conexiones en un socket de dominio UNIX, de forma predeterminada /var/run/acpid.socket
. Las aplicaciones de usuario pueden conectarse a este socket.
#!/bin/bash coproc acpi_listen trap 'kill $COPROC_PID' EXIT while read -u "${COPROC[0]}" -a event; do handler.sh "${event[@]}" done
Donde handler.sh
puede ser una script similar a /etc/acpi/handler.sh
.