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?
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:
programme Crontab et C devant être exécuté dans une fenêtre de terminal
Comment trouver par programme la valeur actuelle de DISPLAY lorsque DISPLAY n'est pas défini?
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].
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
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.
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.
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.