GNU/Linux >> Znalost Linux >  >> Ubuntu

Upravit jas pomocí Xrandr a Cron Job?

UPRAVIT Díky pa4080 jsem přidal jeden řádek do skriptu níže a nyní to funguje skvěle. Přesně nechápu jak, no dobře.

Chtěl bych si v cronu upravit jas v různých hodinách dne. Po nějakém googlování a pokusech a omylech jsem napsal následující bash skript, který funguje dobře:

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

Potom jsem pomocí crontab -e přidal následující řádek:

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

Cronjob se spustí, ale skript se nespustí. Co dělám špatně?

Nejlepší odpověď

Cron ve výchozím nastavení poskytuje omezenou sadu proměnných prostředí. Chcete-li získat xrandr Chcete-li pracovat s úlohou Cron, měli byste exportovat hodnotu $DISPLAY aktuálního uživatele variabilní. Chcete-li to provést, přidejte následující řádek na začátek skriptu (nebo jej přidejte do crontab soubor):

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

Reference:

  • Crontab a program C, který by měl být spuštěn do okna terminálu

  • Jak programově zjistit aktuální hodnotu DISPLAY, když DISPLAY není nastaven?

Nápad se mi líbil a již jsem ho implementoval do svého systému. Zde je moje verze výše uvedeného skriptu:

#!/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
  • Skript je schopen automaticky získat seznam aktivních monitorů. Testoval jsem to se dvěma monitory.

  • Pěkný nápad je umístit spustitelný soubor do /usr/local/bin , takže bude k dispozici také jako příkaz shell. Předpokládejme, že se nazývá brightness .

  • Skript je schopen použít argumenty, které přepíší výchozí hodnoty jasu, například:brightness .9 .

  • Zatímco /usr/local/bin není uveden v crontab 's $PATH variable , úlohy Cron by měly používat úplnou cestu:

    @hourly /usr/local/bin/brightness
    
  • Pravděpodobně @reboot Úlohy cronu nebudou fungovat s aktuální verzí skriptu.

Související:Pokud je balíček dostupný jako deb i jako snap, která metoda je vhodnější?
Ubuntu
  1. Otočit pouze jednu obrazovku?

  2. Jak zobrazit seznam připojených monitorů pomocí Xrandr?

  3. Jak upravit nastavení obrazovky:Kontrast, sytost barev atd?

  1. Jak spravovat úlohy na pozadí Linuxu pomocí příkazů fg a bg

  2. Používáte Notify-Send s Cronem?

  3. Jak spustit úlohu cron každou hodinu a 10 minut

  1. Cron úloha se neprovádí?

  2. Cron Job Use &Policy

  3. Práce s úlohami cron – vytvářejte, upravujte a mažte je pomocí cPanelu