UNPKG

arch-wiki-md-repo

Version:

All arch-wiki articles in markdown format, updated every two days.

382 lines (264 loc) 15.1 kB
[acpid](http://acpid.sourceforge.net/) es un "demonio" flexible y extensible para entregar [eventos ACPI](/index.php?title=ACPI_modules_(Espa%C3%B1ol)&action=edit&redlink=1 "ACPI modules (Español) (page does not exist)"). Vigila `/proc/acpi/event` y cuando hay un evento, ejecuta programas para manejarlo. Estos eventos se activan mediante ciertas acciones, como: * Presionar teclas especiales, incluyendo el botón de Encendido/Hibernar/Suspender. * Cerrando la tapa del portátil * Desconectar un adaptador de Corriente Alterna a un portátil. * Desconectar un jack de un teléfono, etc. **acpid** puede ser usado así mismo, o combinado con un sistema más robusto como [pm-utils](/index.php?title=Pm-utils_(Espa%C3%B1ol)&action=edit&redlink=1 "Pm-utils (Español) (page does not exist)") y [cpufrequtils](/index.php/CPU_frequency_scaling_(Espa%C3%B1ol) "CPU frequency scaling (Español)") para una mayor solución del control de energía. **Nota:** * [Entornos de escritorio](/index.php/Desktop_environment_(Espa%C3%B1ol) "Desktop environment (Español)"), como [GNOME](/index.php/GNOME_(Espa%C3%B1ol) "GNOME (Español)"), gestor de inicio de sesión de [systemd](/index.php/Systemd_(Espa%C3%B1ol)#ACPI_administraci.C3.B3n_de_la_energ.C3.ADa "Systemd (Español)") y algunos demonios [manejadores de teclas extra](/index.php?title=Extra_Keyboard_Keys_(Espa%C3%B1ol)&action=edit&redlink=1 "Extra Keyboard Keys (Español) (page does not exist)") pueden implementar métodos propios de manejo de eventos, independientemente de acpid. Usar más de un sistema a la vez puede provocar un comportamiento inesperado, como suspenderse dos veces de una, tras apretar una vez el botón de hibernar. Ten esto en cuenta y activa solo manejadores deseados. * Ya que por defecto el script que provee acpid, **/etc/acpi/handler.sh**, sobrescribirá la funcionalidad del botón de encendido/apagado de tu entorno de escritorio, seguramente querrás cambiar la rutina de apagado de acpid para evitar apagar el ordenador cuando presiones de golpe el botón de encendido/apagado (ver instrucciones a continuación). ## Contents * [1 Instalación](#Instalaci.C3.B3n) * [2 Configuración](#Configuraci.C3.B3n) * [2.1 Configuración alternativa](#Configuraci.C3.B3n_alternativa) * [3 Trucos y Sugerencias](#Trucos_y_Sugerencias) * [3.1 Ampliando acpid con pm-utils](#Ampliando_acpid_con_pm-utils) * [3.2 Eventos de Ejemplo](#Eventos_de_Ejemplo) * [3.3 Activar el control del volumen](#Activar_el_control_del_volumen) * [3.4 Activar el control del brillo](#Activar_el_control_del_brillo) * [3.5 Habilitar el control del Wi-Fi](#Habilitar_el_control_del_Wi-Fi) * [3.6 Apagar la pantalla del portátil](#Apagar_la_pantalla_del_port.C3.A1til) * [3.7 Sacar el nombre de usuario del monitor actual](#Sacar_el_nombre_de_usuario_del_monitor_actual) * [4 Ver también](#Ver_tambi.C3.A9n) ## Instalación [Instala](/index.php/Help:Reading_(Espa%C3%B1ol)#Instalaci.C3.B3n_de_paquetes "Help:Reading (Español)") el paquete [acpid](https://www.archlinux.org/packages/?name=acpid), disponible en los [repositorios oficiales](/index.php/Official_repositories_(Espa%C3%B1ol) "Official repositories (Español)"). Para que empiece el arranque : * Si usas [systemd](/index.php/Systemd "Systemd") (seguramente), ingresa en un terminal `systemctl enable acpid` ; * Si usas [initscripts](/index.php/Rc.conf "Rc.conf"), edita `/etc/rc.conf` como superusuario y añade `acpid` a la variable DAEMONS. ## Configuración [acpid](https://www.archlinux.org/packages/?name=acpid) viene con un número de acciones predefinidas para eventos activos, como lo qué debería occurrir cuando se presiona el botón de encendido/apagado en el ordenador. Por defecto, esas acciones están definidas en `/etc/acpi/handler.sh`, que se ejecuta después de que se detecta un evento ACPI (según determine `/etc/acpi/events/anything`). Lo siguiente es un ejemplo de una acción. En este caso, cuando se presiona el botón de Hibernar, acpid ejecuta el comando `echo -n mem >/sys/power/state`, que *debería* poner el ordenador en un estado de hibernación (suspendido): ``` button/sleep) case "$2" in SLPB) echo -n mem >/sys/power/state ;; *) logger "ACPI action undefined: $2" ;; esac  ;; ``` Desafortunadamente, no todos los ordenadores etiquetan los eventos ACPI de la misma forma. Por ejemplo, el botón Hibernar puede identificarse en un PC como *SLPB* y en otra como *SBTN*. Para determinar como son reconocidos tus botones o atajos de `teclado`, ejecuta el siguiente comando en un terminal como root: ``` # tail -f /var/log/messages.log ``` Ahora presione el botón de Encendido y/o el botón de Hibernar (p. ej. `Ctrl+Alt+Supr`) de la PC. El resultado debería ser algo asi: ``` logger: ACPI action undefined: PBTN logger: ACPI action undefined: SBTN ``` Si no funciona, intenta: ``` # acpi_listen ``` Entonces presione el botón de Encendido/Apagado y se verá algo así: ``` power/button PBTN 00000000 00000b31 ``` La salida de `acpi_listen` se envía a `/etc/acpi/handler.sh` como parámetros $1, $2 , $3 & $4.. Ejemplo: ``` $1 power/button $2 PBTN $3 00000000 $4 00000b31 ``` Como se puede observar, el botón de Hibernar en la salida de ejemplo es reconocido como *SBTN*, en lugar de la etiqueta *SLPB* especificada en archivo `/etc/acpi/handler.sh` por defecto. Para hacer que el botón de Hibernar funcione correctamente en el PC, necesitaremos reemplazar *SLPB)* con *SBTN)*. Usando esto como base, se puede personalizar fácilmente el archivo `/etc/acpi/handler.sh` para ejecutar una variedad de comandos dependiendo de que evento es ejecutado. Mira la sección [#Trucos y Sugerencias](#Trucos_y_Sugerencias) a continuación para otros comandos usados comúnmente. ### Configuración alternativa Por defecto, todos los eventos ACPI pasan por el script `/etc/acpi/handler.sh`. Esto se debe al conjunto de reglas escritas en `/etc/acpi/events/anything`: ``` # Pass all events to our one handler script event=.* action=/etc/acpi/handler.sh %e ``` Aunque esto funciona muy bien como está, algunos usuarios pueden preferir definir reglas de evento y acciones en sus propios scrpits independientes. Lo siguiente es un ejemplo de cómo usar un archivo de evento individual y su correspondiente script de acción: Como superusuario, crea el archivo siguiente: `/etc/acpi/events/sleep-button` ``` event=button sleep.* action=/etc/acpi/actions/sleep-button.sh "%e" ``` Ahora crea el siguinte archivo: `/etc/acpi/actions/sleep-button.sh` ``` #!/bin/sh case "$2" in SLPB) echo -n mem >/sys/power/state ;; *) logger "ACPI action undefined: $2" ;; esac ``` Finalmente, haz el script ejecutable: ``` # chmod +x /etc/acpi/actions/sleep-button.sh ``` Usando este método, es fácil crear los scripts de eventos/acciones individuales que quieras. ## Trucos y Sugerencias **Sugerencia:** Algunas acciones descritas aquí, como el control del Wi-Fi y del brillo, pueden ser controlados directamente por los drivers. Deberías consultar la documentación de los módulos del kernel correspondientes cuando este sea el caso. ### Ampliando acpid con pm-utils Aunque [acpid](https://www.archlinux.org/packages/?name=acpid) puede proveer una función de suspendido básica, se podría desear un sistema más robusto. [pm-utils](/index.php?title=Pm-utils_(Espa%C3%B1ol)&action=edit&redlink=1 "Pm-utils (Español) (page does not exist)") provee una estructura muy flexible suspender e hibernar, incluyendo soluciones para hardware y drivers tercos (p. ej. módulos fglrx). pm-utils provee dos scripts, `pm-suspend` y `pm-hibernate`, los cuales pueden ser insertados como eventos en acpid. Para más información lee el wiki [pm-utils](/index.php/Pm-utils "Pm-utils") wiki. ### Eventos de Ejemplo Los siguientes son ejemplos de eventos que pueden ser usados en el script `/etc/acpi/handler.sh`. Estos ejemplos deberían ser modificados para que se ajusten a el entorno específico, por ejemplo cambiando los nombres de las variables de evento tal y como las interprete `acpi_listen`. Para bloquear la pantalla con `xscreensaver` cuando se cierra la tapa del portátil intenta: ``` button/lid) case $3 in close) # The lock command need to be run as the user who owns the xscreensaver process and not as root. # See: man xscreensaver-command. $xs will have the value of the user owning the process, if any. xs=$(ps -C xscreensaver -o user=) if test $xs; then su $xs -c "xscreensaver-command -lock"; fi  ;; ``` Para suspender el sistema y bloquear la pantalla usando `slimlock` cuando la tapa está cerrada: ``` button/lid) case $3 in close) #echo "LID switched!">/dev/tty5 /usr/sbin/pm-suspend & DISPLAY=:0.0 su -c - username /usr/bin/slimlock  ;; ``` Ejecuta `pm-suspend` cuando se presiona el botón de suspensión. ``` button/sleep) case "$2" in SBTN) #echo -n mem >/sys/power/state /usr/sbin/pm-suspend  ;; ``` Para ajustar el brillo del portátil según este conectado a la corriente o no (se debería ajustar los números, mira `/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 Descubre la identificación de acpi de los botones de volumen (mira a continuación) y sustituye los eventos acpi en los archivos a continuación. Creamos un script para controlar el volumen (asumiendo que se usa una tarjeta de sonido con [ALSA (Español)](/index.php/ALSA_(Espa%C3%B1ol) "ALSA (Español)")): `/etc/acpi/handlers/vol` ``` #!/bin/sh step=5 case $1 in -) amixer set Master $step-;; +) amixer set Master $step+;; esac ``` Y conectalos a nuevos eventos acpi: `/etc/acpi/events/vol_d` ``` event=button/volumedown action=/etc/acpi/handlers/vol - ``` `/etc/acpi/events/vol_u` ``` event=button/volumeup action=/etc/acpi/handlers/vol + ``` También otro evento para silenciar: `/etc/acpi/events/mute` ``` event=button/mute action=/usr/bin/amixer set Master toggle ``` ### Activar el control del brillo Parecido al control del volumen, acpid también permite controlar el brillo de la pantalla. Para conseguir esto escribe un script como el siguiente: `/etc/acpi/handlers/bl` ``` #!/bin/sh bl_dev=/sys/class/backlight/acpi_video0 step=1 case $1 in -) echo $((`cat $bl_dev/brightness` - $step)) >$bl_dev/brightness;; +) echo $((`cat $bl_dev/brightness` + $step)) >$bl_dev/brightness;; esac ``` y otra vez, conecta las teclas a 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 + ``` ### Habilitar el control del Wi-Fi También se puede crear un sencillo controlador wireless presionando los botones WLAN. Un ejemplo de evento: `/etc/acpi/events/wlan` ``` event=button/wlan action=/etc/acpi/handlers/wlan ``` y su script manejador: `/etc/acpi/handlers/wlan` ``` #!/bin/sh rf=/sys/class/rfkill/rfkill0 case `cat $rf/state` in 0) echo 1 >$rf/state && systemctl start net-auto-wireless;; 1) systemctl stop net-auto-wireless && echo 0 >$rf/state;; esac ``` ### Apagar la pantalla del portátil Adaptado del [de Gentoo](http://www.gentoo-wiki.info/ACPI/Configuration%7CWiki), viene esta pequeña perla. Añade esto al final de `/etc/acpi/actions/lm_lid.sh` o a la sección *button/lid* `/etc/acpi/handler.sh`. Esto apagará la luz de la pantalla cuando la tapa esté cerrada, y la encenderá cuando la tapa se abra. ``` case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in closed) XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force off ;; open) XAUTHORITY=$(ps -C xinit -f --no-header | sed -n 's/.*-auth //; s/ -[^ ].*//; p') xset -display :0 dpms force on  ;; esac ``` Si se quiere incrementar/disminuir el brillo o algo que dependa de X, se debe especificar el monitor con X y también el archivo MIT magic cookie (via XAUTHORITY). Lo último es una credencial de seguridad que provee acceso de escritura y lectura al servidor X, monitor, y dispositivos de entrada. Aquí hay otro script que no usa XAUTHORITY sino sudo: ``` case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in closed) sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force off ;; open) sudo -u `ps -o ruser= -C xinit` xset -display :0 dpms force on  ;; esac ``` Con ciertas combinaciones de [Xorg](/index.php/Xorg_(Espa%C3%B1ol) "Xorg (Español)") y hardware problemático, `xset dpms force off` solo deja en blanco la pantalla dejando la luz encendida. Esto puede ser corregido usando [vbetool](https://www.archlinux.org/packages/?name=vbetool) de los [repositorios oficiales](/index.php/Official_repositories_(Espa%C3%B1ol) "Official repositories (Español)"). Cambia la sección LCD a: ``` case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in closed) vbetool dpms off ;; open) vbetool dpms on  ;; esac ``` Si el monitor se apaga solo brevemente y después se enciende, seguramente sea el control de energía que viene con xscreensaver, que entra en conflicto con los ajustes manuales de *dpm'.* ### Sacar el nombre de usuario del monitor actual Se puede usar la función `getuser` para descubrir el usuario del monitor actual: ``` getuser () { export DISPLAY=`echo $DISPLAY | cut -c -2` user=`who | grep " $DISPLAY" | awk '{print $1}' | tail -n1` export XAUTHORITY=/home/$user/.Xauthority eval $1=$user } ``` Se puede usar esta función, por ejemplo, cuando se presiona el botón de Encendido/Apagado, y se requiere apagar [KDE](/index.php/KDE_(Espa%C3%B1ol) "KDE (Español)") correctamente: ``` button/power) case "$2" in PBTN) getuser "$user" echo $user > /dev/tty5 su $user -c "dcop ksmserver ksmserver logout 0 2 0"  ;; *) logger "ACPI action undefined $2" ;; esac  ;; ``` En sistemas más nuevos usando systemd, los accesos a X11 no son necesariamente mostrados en `who`, de manera que la función `getuser` no sirve. Una alternativa es usar `loginctl` para obtener la información requerida (p.ej. usando [xuserrun](https://github.com/rephorm/xuserrun). ## Ver también * [http://acpid.sourceforge.net/](http://acpid.sourceforge.net/) - página de acpid * [Gentoo wiki](http://www.gentoo-wiki.info/ACPI/Configuration) * [ACPI hotkeys](/index.php?title=ACPI_hotkeys_(Espa%C3%B1ol)&action=edit&redlink=1 "ACPI hotkeys (Español) (page does not exist)")