BEARBEITEN Dank pa4080 habe ich dem Skript unten eine Zeile hinzugefügt und jetzt funktioniert es großartig. Ich verstehe nicht genau wie, na ja.
Ich möchte einen Cron-Job machen, um meine Helligkeit zu verschiedenen Tageszeiten anzupassen. Nachdem ich etwas gegoogelt und versucht habe, habe ich das folgende Bash-Skript geschrieben, das gut funktioniert:
#!/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
Dann habe ich crontab -e verwendet, um die folgende Zeile hinzuzufügen:
0 * * * * /home/piney/screendimmer.sh
Der Cronjob wird ausgelöst, aber das Skript wird nicht ausgeführt. Was mache ich falsch?
Beste Antwort
Cron stellt standardmäßig eine begrenzte Anzahl von Umgebungsvariablen bereit. Um xrandr
zu erhalten Um einen Cron-Job abzuarbeiten, sollten Sie den Wert des $DISPLAY
des aktuellen Benutzers exportieren Variable. Fügen Sie dazu die folgende Zeile am Anfang Ihres Skripts hinzu (oder fügen Sie sie innerhalb der crontab
hinzu Datei):
export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')
Referenzen:
-
Crontab und C-Programm, das in einem Terminalfenster ausgeführt werden soll
-
Wie kann man den aktuellen Wert von DISPLAY programmgesteuert finden, wenn DISPLAY nicht gesetzt ist?
Ich fand die Idee gut und habe sie bereits in meinem System implementiert. Hier ist meine Version des obigen Skripts:
#!/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
-
Das Skript kann die Liste der aktiven Monitore automatisch abrufen. Ich habe es mit zwei Monitoren getestet.
-
Eine nette Idee ist, die ausführbare Datei in
/usr/local/bin
zu platzieren , wird also auch als Shell-Befehl verfügbar sein. Nehmen wir an, es heißtbrightness
. -
Das Skript kann ein Argument verwenden, das die Standardhelligkeitswerte überschreibt, zum Beispiel:
brightness .9
. -
Während
/usr/local/bin
nicht in dercrontab
aufgeführt ist ’s$PATH variable
, sollten die Cron-Jobs den vollständigen Pfad verwenden:@hourly /usr/local/bin/brightness
-
Wahrscheinlich der
@reboot
Cron-Jobs funktionieren nicht mit der aktuellen Version des Skripts.