web-dev-qa-db-fra.com

Ajustez la luminosité avec xrandr et cron job

EDIT Merci à pa4080, j'ai ajouté une ligne au script ci-dessous et maintenant cela fonctionne très bien. Je ne comprends pas vraiment comment, oh bien.

Je voudrais faire un travail cron pour ajuster ma luminosité à différentes heures de la journée. Après avoir fait quelques recherches sur google et essais et erreurs, j'ai écrit le script bash suivant qui fonctionne bien:

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

Ensuite, j'ai utilisé crontab -e pour ajouter la ligne suivante:

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

Le cronjob est déclenché mais le script ne s'exécute pas. Qu'est-ce que je fais mal?

6
Piney

Cron fournit un ensemble limité de variables d'environnement par défaut [1]. Pour que xrandr fonctionne avec un travail Cron, vous devez exporter [2] la valeur de la variable $DISPLAY de l'utilisateur actuel [3]. Pour ce faire, ajoutez la ligne suivante au début de votre script (ou ajoutez-la dans le fichier crontab [4]):

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

Références:


J'ai aimé l'idée et je l'ai déjà implémentée dans mon système. Voici ma version du script ci-dessus:

#!/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 && $2 ~ /tty[0-9]+/ {print $3; 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 "$1"; 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 "$1"    # If the scipt is called with an additional argument: 'brightness "<value>"'
fi
  • Le script est capable d’obtenir automatiquement la liste des moniteurs actifs. Je l'ai testé avec deux moniteurs.

  • La bonne idée est de placer le fichier exécutable [5] dans /usr/local/bin, il sera donc également disponible en tant que commande Shell. Supposons qu'il s'appelle brightness.

  • Le script peut utiliser un argument qui remplacera les valeurs de luminosité par défaut, par exemple: brightness .9.

  • Bien que /usr/local/bin ne figure pas dans la liste de crontab$PATH variable [1][4][6], les travaux Cron doivent utiliser le chemin complet:

    @hourly /usr/local/bin/brightness
    
  • Les travaux @reboot Cron ne fonctionneront probablement pas avec la version actuelle du script. [7].

7
pa4080

Vous devez taper le chemin où xrandr est installé. Tapez command -v xrandr (ou which xrandr) pour savoir où il est installé. Je suppose que c'est /usr/bin/xrandr, s'il est installé par défaut.

Donc, éditez votre crontab ainsi:

#!/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
5
Redbob

Au lieu d'écrire des tâches cron pour modifier manuellement la luminosité de votre écran, vous pouvez jeter un œil à redshift , un programme capable de le faire exactement. Il peut être configuré pour suivre la lumière du jour à votre emplacement et modifier la luminosité et la température de couleur de votre écran afin de mieux correspondre à la lumière naturelle.

Image illustrating the effect of redshift

Son principal argument de vente est le changement de la température de couleur (c'est-à-dire, le décalage de couleur vers le rouge, d'où provient son nom), mais il peut également régler la luminosité. Vous pouvez le configurer pour ne faire que de la luminosité, si c'est ce que vous voulez.

Le principal avantage de la solution manuelle est que redshift modifie la couleur/la luminosité progressivement, en fonction du cycle quotidien actuel de votre emplacement, plutôt que par étapes, comme pour votre approche cron. Vous pouvez également activer/désactiver l'effet assez facilement; l'envoi du processus, SIGUSR1 activera l'effet. J'ai créé un raccourci clavier qui fait killall -USR1 redshift pour le rendre facilement accessible.

Il existe un autre programme de fonctionnalité similaire appelé f.Lux , qui prend également en charge Windows et MacOS et semble assez populaire. Je n'ai aucune expérience avec cela cependant; en particulier, je ne suis pas tout à fait sûr que cela puisse modifier la luminosité en plus de la température de couleur.

5
marcelm

Une autre option serait d'utiliser xbacklight si vous utilisez xrand comme ceci: xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3 cette commande échouera si vous avez _ la sortie VGA.

Vous pouvez l'installer avec Sudo apt install xbacklight. J'utilise xbacklight en collaboration avec redshift ensemble, ils sont les meilleurs.

0
user354822