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?
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].
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.
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
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.
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