Difference between revisions of "Acpid (Español)"

From ArchWiki
Jump to: navigation, search
(Configuración alternativa: sección actualizada)
(Consejos y trucos: sección actualizada)
Line 105: Line 105:
  
 
== Consejos y trucos ==
 
== Consejos y trucos ==
{{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===
+
{{Nota|Algunas de las acciones descritas aquí, como el control de brillo de la pantalla y la (des)activación Wi-Fi, pueden ser ya administradas directamente por el controlador. Debe consultar la documentación de los módulos del kernel correspondientes, cuando este sea el caso.}}
  
Aunque {{Pkg|acpid}} puede proveer una función de suspendido básica, se podría desear un sistema más robusto.  [[pm-utils (Español)|pm-utils]] 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, {{ic|pm-suspend}} y {{ic|pm-hibernate}}, los cuales pueden ser insertados como eventos en acpid. Para más información lee el wiki [[pm-utils]] wiki.
+
=== Eventos de ejemplo ===
  
===Eventos de Ejemplo===
+
Los siguientes son ejemplos de eventos que se pueden usar en el script {{ic|/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 {{ic|acpi_listen}}.
  
Los siguientes son ejemplos de eventos que pueden ser usados en el script {{ic|/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 {{ic|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, consulte {{ic|/sys/class/backlight/acpi_video0/max_brightness}}):
 
 
Para bloquear la pantalla con {{ic|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 {{ic|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 {{ic|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 {{ic|/sys/class/backlight/acpi_video0/max_brightness}}):
 
  
 
  ac_adapter)
 
  ac_adapter)
Line 162: Line 128:
 
=== Activar el control del volumen ===
 
=== 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)]]):
+
Averigüe la identidad acpi de los botones de volumen (consultar arriba) y sustitúyalos por los eventos acpi en los archivos a continuación.
  
{{hc|/etc/acpi/handlers/vol|<nowiki>
+
{{hc|1=/etc/acpi/events/vol-d|2=
#!/bin/sh
+
event=button/volumedown
step=5
+
action=amixer set Master 5-
 +
}}
  
case $1 in
+
{{hc|1=/etc/acpi/events/vol-m|2=
  -) amixer set Master $step-;;
+
event=button/mute
  +) amixer set Master $step+;;
+
action=amixer set Master toggle
esac
+
}}
</nowiki>}}
 
  
Y conectalos a nuevos eventos acpi:
+
{{hc|1=/etc/acpi/events/vol-u|2=
 +
event=button/volumeup
 +
action=amixer set Master 5+
 +
}}
  
{{hc|/etc/acpi/events/vol_d|<nowiki>
+
{{Nota|1=Estos comandos pueden no funcionar como se espera con PulseAudio. [https://lists.freedesktop.org/archives/pulseaudio-discuss/2015-December/025062.html] Para una funcionalidad completa, ejecute comandos como el usuario actual mientras especifica la [[environment variables (Español)|variable de entorno]] {{ic|XDG_RUNTIME_DIR}}, por ejemplo con {{ic|1=sudo -u ''usuario'' XDG_RUNTIME_DIR=/run/user/''1000'' pactl}}.}}
event=button/volumedown
 
action=/etc/acpi/handlers/vol -
 
</nowiki>}}
 
{{hc|/etc/acpi/events/vol_u|<nowiki>
 
event=button/volumeup
 
action=/etc/acpi/handlers/vol +
 
</nowiki>}}
 
  
También otro evento para silenciar:
+
{{Sugerencia|Desactive o vincule los botones de volumen en Xorg para evitar conflictos con otras aplicaciones. Consulte [[Xmodmap]] para más detalles.}}
  
{{hc|/etc/acpi/events/mute|<nowiki>
+
Consulte también  [http://web.archive.org/web/20150711044207/http://blog.lastlog.de/posts/fixing_volume_change_in_linux].
event=button/mute
 
action=/usr/bin/amixer set Master toggle
 
</nowiki>}}
 
  
 
=== Activar el control del brillo ===
 
=== 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:
+
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:
  
{{hc|/etc/acpi/handlers/bl|<nowiki>
+
{{hc|/etc/acpi/handlers/bl|2=
 
#!/bin/sh
 
#!/bin/sh
 
bl_dev=/sys/class/backlight/acpi_video0
 
bl_dev=/sys/class/backlight/acpi_video0
Line 202: Line 161:
  
 
case $1 in
 
case $1 in
   -) echo $((`cat $bl_dev/brightness` - $step)) >$bl_dev/brightness;;
+
   -) echo $(($(< $bl_dev/brightness) - $step)) >$bl_dev/brightness;;
   +) echo $((`cat $bl_dev/brightness` + $step)) >$bl_dev/brightness;;
+
   +) echo $(($(< $bl_dev/brightness) + $step)) >$bl_dev/brightness;;
 
esac
 
esac
</nowiki>}}
+
}}
  
y otra vez, conecta las teclas a eventos ACPI:
+
y nuevamente, conecte las teclas a los eventos ACPI:
  
{{hc|/etc/acpi/events/bl_d|<nowiki>
+
{{hc|/etc/acpi/events/bl_d|2=
 
event=video/brightnessdown
 
event=video/brightnessdown
 
action=/etc/acpi/handlers/bl -
 
action=/etc/acpi/handlers/bl -
</nowiki>}}
+
}}
{{hc|/etc/acpi/events/bl_u|<nowiki>
+
{{hc|/etc/acpi/events/bl_u|2=
 
event=video/brightnessup
 
event=video/brightnessup
 
action=/etc/acpi/handlers/bl +
 
action=/etc/acpi/handlers/bl +
</nowiki>}}
+
}}
  
=== Habilitar el control del Wi-Fi ===
+
=== Habilitar el control Wi-Fi ===
  
También se puede crear un sencillo controlador wireless presionando los botones WLAN. Un ejemplo de evento:
+
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:
  
{{hc|/etc/acpi/events/wlan|<nowiki>
+
{{hc|/etc/acpi/events/wlan|2=
 
event=button/wlan
 
event=button/wlan
 
action=/etc/acpi/handlers/wlan
 
action=/etc/acpi/handlers/wlan
</nowiki>}}
+
}}
  
y su script manejador:
+
y su controlador:
  
{{hc|/etc/acpi/handlers/wlan|<nowiki>
+
{{hc|/etc/acpi/handlers/wlan|2=
 
#!/bin/sh
 
#!/bin/sh
 
rf=/sys/class/rfkill/rfkill0
 
rf=/sys/class/rfkill/rfkill0
  
case `cat $rf/state` in
+
case $(< $rf/state) in
   0) echo 1 >$rf/state && systemctl start net-auto-wireless;;
+
   0) echo 1 >$rf/state;;
   1) systemctl stop net-auto-wireless && echo 0 >$rf/state;;
+
   1) echo 0 >$rf/state;;
 
esac
 
esac
</nowiki>}}
+
}}
  
=== Apagar la pantalla del portátil ===
+
=== Obtener el nombre de usuario de la pantalla actual ===
  
Adaptado del [http://www.gentoo-wiki.info/ACPI/Configuration|Wiki de Gentoo], viene esta pequeña perla. Añade esto al final de {{ic|/etc/acpi/actions/lm_lid.sh}} o a la sección ''button/lid'' {{ic|/etc/acpi/handler.sh}}. Esto apagará la luz de la pantalla cuando la tapa esté cerrada, y la encenderá cuando la tapa se abra.
+
Para ejecutar comandos que dependan de [[Xorg (Español)|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 (consulte {{man|1|xauth}}).
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.
+
Consulte [https://gist.githubusercontent.com/AladW/de1c5676d93d05a5a0e1/raw/16e010ecda9f2328e1e22d4e02ac814ed27717b4/gistfile1.txt] para una función de ejemplo cuando se usa [[xinitrc]].
  
Aquí hay otro script que no usa XAUTHORITY sino sudo:
+
{{Nota|
 +
* Si la luz de fondo de la pantalla LCD no se apaga cuando la tapa está cerrada, puede hacerlo manualmente ejecutando {{ic|getXuser xset dpms force off}} y {{ic|getXuser 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 {{Pkg|vbetool}} con {{ic|betool dpms off}} y {{ic|vbetool dpms on}}. Consulte también [[XScreenSaver (Español)#Configuración|Configuración de XScreenSaver]].
 +
* Cuando utilice ''who'' o ''w'', asegúrese de que se cree {{ic|/run/utmp}} en el momento del arranque. Consulte {{man|5|utmp}} para más detalles.
 +
}}
  
case $(cat /proc/acpi/button/lid/LID0/state | awk '{print $2}') in
+
==== Conectar a un socket acpid ====
    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 (Español)|Xorg]] y hardware problemático, {{ic|xset dpms force off}} solo deja en blanco la pantalla dejando la luz encendida. Esto puede ser corregido usando {{Pkg|vbetool}} de los [[Official repositories (Español)|repositorios oficiales]]. Cambia la sección LCD a:
+
Además de los archivos de reglas, acpid acepta conexiones en un socket de dominio UNIX, de forma predeterminada {{ic|/var/run/acpid.socket}}. Las aplicaciones de usuario pueden conectarse a este socket.
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'.
+
{{bc|
 
+
#!/bin/bash
=== Sacar el nombre de usuario del monitor actual ===
+
coproc acpi_listen
Se puede usar la función {{ic|getuser}} para descubrir el usuario del monitor actual:
+
trap 'kill $COPROC_PID' EXIT
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 (Español)|KDE]] 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
 
    ;;
 
  
 +
while read -u "${COPROC[0]}" -a event; do
 +
    ''handler.sh'' "${event[@]}"
 +
done
 +
}}
  
En sistemas más nuevos usando systemd, los accesos a X11 no son necesariamente mostrados en {{ic|who}}, de manera que la función {{ic|getuser}} no sirve. Una alternativa es usar {{ic|loginctl}} para obtener la información requerida (p.ej. usando [https://github.com/rephorm/xuserrun xuserrun].
+
Donde ''handler.sh'' puede ser una script similar a {{ic|/etc/acpi/handler.sh}}.
  
 
==Ver también==
 
==Ver también==

Revision as of 21:37, 13 September 2018

Estado de la traducción: este artículo es una versión traducida de Acpid. Fecha de la última traducción/revisión: 2018-09. Puedes ayudar a actualizar la traducción, si adviertes que la versión inglesa ha cambiado: ver cambios.

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.
Nota: Los entornos de escritorio, como GNOME, el administrador de inicio de sesión de systemd y algunos demonios que manejan teclas extra pueden implementar esquemas propios de manejo de eventos, independientes de acpid. La ejecución de más de un sistema al mismo tiempo puede provocar un comportamiento inesperado, como suspender dos veces seguidas después de presionar un botón de suspensión. Tenga esto en cuenta y active solo los manejadores que necesite.

Instalación

Instale el paquete acpid. Entonces inicie y/o 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 el comando 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 el siguiente comando:

# 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 comandos según el evento que se active. Consulte la sección #Consejos y trucos a continuación para conocer otros comandos usados comúnmente.

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 el siguiente archivo:

/etc/acpi/events/sleep-button
event=button sleep.*
action=/etc/acpi/actions/sleep-button.sh %e

Ahora cree el siguiente archivo:

/etc/acpi/actions/sleep-button.sh
#!/bin/sh
case "$3" in
    SLPB) echo -n mem >/sys/power/state ;;
    *)    logger "ACPI action undefined: $3" ;;
esac

Finalmente, haga el script ejecutable:

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

Al usar este método, es fácil crear cualquier cantidad de scripts de eventos/acciones individuales.

Consejos y trucos

Nota: Algunas de las acciones descritas aquí, como el control de brillo de la pantalla y la (des)activación Wi-Fi, pueden ser ya administradas directamente por el controlador. Debe consultar la documentación de los módulos del kernel correspondientes, cuando este sea el caso.

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, consulte /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 (consultar 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+
Nota: Estos comandos pueden no funcionar como se espera con PulseAudio. [1] Para una funcionalidad completa, ejecute comandos como el usuario actual mientras especifica la variable de entorno XDG_RUNTIME_DIR, por ejemplo con sudo -u usuario XDG_RUNTIME_DIR=/run/user/1000 pactl.
Sugerencia: Desactive o vincule los botones de volumen en Xorg para evitar conflictos con otras aplicaciones. Consulte Xmodmap para más detalles.

Consulte 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 +

Habilitar 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 comandos 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 (consulte xauth(1)).

Consulte [3] para una función de ejemplo cuando se usa xinitrc.

Nota:
  • 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 y getXuser 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 con betool dpms off y vbetool dpms on. Consulte también Configuración de XScreenSaver.
  • Cuando utilice who o w, asegúrese de que se cree /run/utmp en el momento del arranque. Consulte 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.

Ver también