ubuntu - bash - Ajustar el brillo con xrandr y trabajo cron

CorePress2023-09-17  2

EDITAR Gracias a pa4080 agregué una línea al siguiente script y ahora funciona muy bien. No entiendo exactamente cómo, bueno.

Me gustaría hacer un trabajo cron para ajustar mi brillo en diferentes horas del día. Después de buscar en Google y de prueba y error, escribí el siguiente script bash que funciona bien:

#!/bin/bash
export DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}')

H=$(date +%H)

if (( 00 <= 10#$H && 10#$H < 07 )); then
    xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3
elif (( 07 <= 10#$H && 10#$H < 10 )); then
    xrandr --output HDMI-1 --brightness .5 && xrandr --output HDMI-2 --brightness .5 && xrandr --output HDMI-3 --brightness .5
elif (( 10 <= 10#$H && 10#$H < 19 )); then
    xrandr --output HDMI-1 --brightness .7 && xrandr --output HDMI-2 --brightness .7 && xrandr --output HDMI-3 --brightness .7
elif (( 19 <= 10#$H && 10#$H < 22 )); then
    xrandr --output HDMI-1 --brightness .5 && xrandr --output HDMI-2 --brightness .5 && xrandr --output HDMI-3 --brightness .5
elif (( 22 <= 10#$H && 10#$H < 23 )); then
    xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3
else
    echo "Error"
fi

Luego usé crontab -e para agregar la siguiente línea:

0 * * * * /home/piney/screendimmer.sh

El cronjob se activa pero el script no se ejecuta. ¿Qué estoy haciendo mal?

  • 5 En una nota al margen: la herramienta de desplazamiento al rojo puede ajustar el brillo y la temperatura del color según la posición geográfica y la duración actual del día. -Michael 22 de septiembre de 2017 a las 8:23
  • 1 Posible duplicado de ¿Cómo iniciar una aplicación GUI desde cron? - David Foerster 22 de septiembre de 2017 a las 11:35
  • Posible duplicado de ¿Cómo encontrar mediante programación el valor actual de DISPLAY cuando DISPLAY no está configurado? (para usar en crontab) -pa4080 22 de septiembre de 2017 a las 11:42
  • Posiblemente relacionado (pero sin respuesta):  Ubuntu 16.04 No se puede bloquear la pantalla con Cron  (en superusuario). – G-Man dice 'Reintegrar a Monica' 22 de septiembre de 2017 a las 17:49
  • Posiblemente relacionado: ¿Abrir una ventana en una pantalla X remota (por qué “No se puede abrir la pantalla”)? (en Unix y Linux) – G-Man dice 'Reintegrar a Monica' 23 de septiembre de 2017 a las 22:21


------------Respuesta------------

Cron proporciona un conjunto limitado de variables de entorno.es por defecto [1]. Para que xrandr funcione a través de un trabajo Cron, debe exportar [2] el valor de la variable $DISPLAY [3] del usuario actual. Para hacerlo, agregue la siguiente línea al comienzo de su secuencia de comandos (o agréguela dentro del archivo crontab [4]):

export DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}')

Referencias:

  • Programa Crontab y C que debe ejecutarse en una ventana de terminal

  • ¿Cómo encontrar mediante programación el valor actual de DISPLAY cuando DISPLAY no está configurado?


Me gustó la idea y ya la implementé en mi sistema. Aquí está mi versión del script anterior:

#!/bin/bash

# While the user is not logged in == until the $DISPLAY variable is unset or empty
unset DISPLAY
while [ -z "$DISPLAY" ] || [ "$DISPLAY" == "" ]; do
        DISPLAY=$(w "$(id -un)" | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}' 2>/dev/null)
        if [ "$DISPLAY" == "" ]; then sleep 30; else export DISPLAY="$DISPLAY"; fi
done

brightness(){
        # Get the list of the active monitors automatically
        # To set this list manually use: OUT=( VGA-1 HDMI-1 HDMI-2 HDMI-3 )
        OUT=$(xrandr --listactivemonitors | awk 'NR!=1{print " "$NF" "}')
        # Adjust the brightness level for each monitor
        for current in "${OUT[@]}"; do xrandr --output "${current// /}" --brightness ""; done
}

if [ -z "${1+x}" ]; then  # If the scrip is called from Cron or CLI without an argument: 'brightness'
        H=$(date +%-H)
        if   ((  0 <= "$H" && "$H" <  7 )); then brightness ".5"
        elif ((  7 <= "$H" && "$H" < 10 )); then brightness ".6"
        elif (( 10 <= "$H" && "$H" < 19 )); then brightness ".7"
        elif (( 19 <= "$H" && "$H" < 22 )); then brightness ".6"
        elif (( 22 <= "$H" && "$H" < 24 )); then brightness ".5"
        else echo "Error"
        fi
else brightness ""    # If the scipt is called with an additional argument: 'brightness "<value>"'
fi
  • El script puede obtener la lista de monitores activos automáticamente. Lo he probado con dos monitores.

  • Buena idea es colocar el exearchivo cortable [5] en /usr/local/bin, por lo que también estará disponible como comando de shell. Supongamos que se llama brillo.

  • El script puede utilizar argumentos que anularán los valores de brillo predeterminados, por ejemplo: brillo .9.

  • Si bien /usr/local/bin no aparece en la variable $PATH del crontab [1] [4] [6], los trabajos cron deben usar la ruta completa:

    @hourly /usr/local/bin/brightness
    
  • Probablemente las tareas @reboot Cron no funcionarán con la versión actual del script [7].


  • 1 ¡Genial, @pa4080! Resolverás un problema que tengo con DISPLAY desde hace mucho tiempo... – Redbob 22 de septiembre de 2017 a las 10:23
  • Para compatibilidad con @reboot, consulte estas preguntas y respuestas: Askubuntu.com/questions/1102389/xrandr-not-working-on-crontab/… sus comentarios serán bienvenidos. -WinEunuuchs2Unix 17 de diciembre de 2018 a las 14:42


------------Respuesta------------

En lugar de escribir trabajos cron para cambiar manualmente el brillo de la pantalla, es posible que desees echarle un vistazo al corrimiento al rojo, un programa que puede hacer exactamente esto. Se puede configurar para realizar un seguimiento de la luz del día en su ubicación y cambiar tanto el brillo como la temperatura del color de la pantalla para que coincida mejor con la luz natural.

Su principal atractivo comercial es cambiar la temperatura del color (es decir, cambiar el color más hacia el rojo, que es de donde proviene el nombre), pero también puede ajustar el brillo. Podrías configurarlo para que funcione solo con brillo, sieso es lo que quieres.

La principal ventaja sobre la solución manual es que el desplazamiento al rojo cambia el color/brillo gradualmente, de acuerdo con el ciclo diario actual de su ubicación, en lugar de hacerlo en pasos como ocurre con el enfoque cron. También puedes activar/desactivar el efecto con bastante facilidad; enviar el proceso SIGUSR1 alternará el efecto. Hice una combinación de teclas que elimina el desplazamiento al rojo -USR1 para que sea fácilmente accesible.

Existe otro programa de funcionalidad similar llamado f.lux, que también es compatible con Windows y MacOS y parece bastante popular. Sin embargo, no tengo experiencia con eso; en particular, no estoy del todo seguro de si puede cambiar el brillo además de la temperatura del color.


  • Esta solución es válida @marcelm, además Piney no informó el sabor y la versión de Ubuntu. Es bueno comprobar siTrabajaré en ello. ¿El desplazamiento al rojo funciona con horarios programados para cambiar la configuración? - Redbob 22 de septiembre de 2017 a las 12:18
  • @Redbob Hasta donde yo séAhora, el corrimiento al rojo no puede cambiar la configuración en "horas programadas", sino solo rastrear la luz solar. Lo hace calculando la posición del sol en función de su ubicación y hora. Entonces mi respuesta es más bien una alternativa; un intento de responder al deseo subyacente del OP en lugar de su pregunta exacta. - marcelmo 22 de septiembre de 2017 a las 13:25
  • Genial, @marcelm. Capte mi voto... Lo instalé en mi computadora (lubuntu), pero está buscando 'geoclue2' y no seguirá adelante. Mi red tiene proxy, por eso puedo ejecutarla. - Redbob 22 de septiembre de 2017 a las 13:43
  • No quiero una temperatura de color diferente; de ​​lo contrario, usaría uno de los muchos programas que ya hacen eso. - Piney 26 de septiembre de 2017 a las 7:28
  • @Piney Abordé esto explícitamente en mi respuesta: "Puedes configurarlo para que haga solo brrectitud, si eso es lo que quieres." - marcelmo 1 de octubre de 2018 a las 19:53


------------Respuesta------------

Debe escribir la ruta donde está instalado xrandr. Tipo comando -v xrandr (o cual xrandr) para saber dónde está instalado. Supongo que es /usr/bin/xrandr, si está instalado de forma predeterminada.

Entonces, edite su crontab para que:

#!/bin/bash

H=$(date +%k)

if   (( $H >  0 && $H <=  7 )); then
    /usr/bin/xrandr --output HDMI-1 --brightness .3 && /usr/bin/xrandr --output HDMI-2 --brightness .3 && /usr/bin/xrandr --output HDMI-3 --brightness .3
elif (( $H >  7 && $H <= 10 )); then
    /usr/bin/xrandr --output HDMI-1 --brightness .5 && /usr/bin/xrandr --output HDMI-2 --brightness .5 && /usr/bin/xrandr --output HDMI-3 --brightness .5
elif (( $H > 10 && $H <= 19 )); then
    /usr/bin/xrandr --output HDMI-1 --brightness .7 && /usr/bin/xrandr --output HDMI-2 --brightness .7 && /usr/bin/xrandr --output HDMI-3 --brightness .7
elif (( $H > 19 && $H <= 22 )); then
    /usr/bin/xrandr --output HDMI-1 --brightness .5 && /usr/bin/xrandr --output HDMI-2 --brightness .5 && /usr/bin/xrandr --output HDMI-3 --brightness .5
elif (( $H > 22 && $H <= 23 )); then
    /usr/bin/xrandr --output HDMI-1 --brightness .3 && /usr/bin/xrandr --output HDMI-2 --brightness .3 && /usr/bin/xrandr --output HDMI-3 --brightness .3
else
    echo "Error"
fi

  • Este no es el problema aquí, porque xrandr en realidad está ubicado en /usr/bin/, pero es el valor predeterminado de crontab&# variable $PATH de 39;ses /usr/bin:/bin. -pa4080 22 de septiembre de 2017 a las 8:36
  • gracias por la sugerencia pero no funciona :(- Piney 26 de septiembre de 2017 a las 7:28
  • Pinney, ¿seguiste las instrucciones del pa4080? Creo que te ayudarán. De lo contrario, instalé Redshift como sugirió Marcelm, funciona de maravilla. - Redbob 26 de septiembre de 2017 en 13:53


------------Respuesta------------

Otra opción sería usar xbacklight si usa xrand de esta manera: xrandr --output HDMI-1 --brightness .3 && xrandr --salida HDMI-2 --brillo .3 && xrandr --output HDMI-3 --brightness .3 este comando fallará si tiene salida VGA.

Puedes instalarlo con sudo apt install xbacklight. Utilizo xbacklight en colaboración con redshift y juntos son los mejores.


  • Hola, Urosjarc, ¿cómo podemos utilizar estas funciones? Por favor, elabora tu respuesta y da un ejemplo de uso.-pa4080 29 de septiembre de 2017 a las 8:35


------------Respuesta------------

echo $(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {imprimir $3; salir}') no da resultados en Ubuntu 18.04. Entonces lo acabo de hacer echo $DISPLAY dentro del script y el resultado mostró: 0 luego agregué exportar PANTALLA=:0 ¡Y mi trabajo cron funcionó! Mi guión final se ve así:

#!/bin/bash
# export DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; exit}')
# echo $DISPLAY
export DISPLAY=:0
xrandr --output  --brightness