GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Helligkeit mit Xrandr und Cron-Job anpassen?

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ßt brightness .

  • Das Skript kann ein Argument verwenden, das die Standardhelligkeitswerte überschreibt, zum Beispiel:brightness .9 .

  • Während /usr/local/bin nicht in der crontab 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.

Verwandte:Wenn ein Paket sowohl als Deb als auch als Snap verfügbar ist, welche Methode ist vorzuziehen?
Ubuntu
  1. So verwalten Sie Linux-Hintergrundjobs mit den Befehlen fg und bg

  2. Verwenden Sie Notify-Send mit Cron?

  3. Nur einen Bildschirm drehen?

  4. Cron-Job wird nicht ausgeführt?

  5. Cronjob alle 1 Stunde und 10 Minuten ausführen

Geplante Cron-Jobs

Wie richtet man einen Cron Job mit Sonderzeichen bei Hostinger ein?

Cron-Job erstellen und löschen

Was ist ein Cronjob unter Linux

Cron Vs Anacron:So richten Sie Anacron unter Linux ein (mit einem Beispiel)

So richten Sie einen Cron in cPanel ein und führen ihn aus