Отрегулируйте яркость с помощью xrandr и cron - proUbuntu
Купить гитару в Москве
6 голосов
/

РЕДАКТИРОВАТЬ Благодаря pa4080 я добавил одну строку в скрипт ниже, и теперь он отлично работает. Я не совсем понимаю, как, ну да ладно.

Я хотел бы сделать работу cron, чтобы отрегулировать яркость в разные часы дня. После некоторого поиска и проб и ошибок я написал следующий скрипт bash, который хорошо работает:

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

Затем я использовал crontab -e, чтобы добавить следующую строку:

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

Cronjob срабатывает, но скрипт не запускается. Что я делаю не так?

Ответы [ 4 ]

7 голосов
/

Cron предоставляет ограниченный набор переменных окружения по умолчанию [1] . Чтобы заставить xrandr работать через задание Cron, вы должны экспортировать [2] значение $DISPLAY переменной текущего пользователя [3] . Для этого добавьте следующую строку в начало вашего сценария (или добавьте его в файл crontab [4] ):

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

Ссылки:


Мне понравилась идея, и я уже реализовал ее в своей системе. Вот моя версия вышеуказанного скрипта:

#!/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
  • Скрипт может автоматически получать список активных мониторов. Я проверил это с двумя мониторами.

  • Хорошая идея - поместить исполняемый файл [5] в /usr/local/bin, поэтому он будет доступен и в качестве команды оболочки. Давайте предположим, что это называется brightness.

  • Сценарий может использовать аргументы, которые будут переопределять значения яркости по умолчанию, например: brightness .9.

  • Хотя /usr/local/bin не указан в crontab $PATH variable [1] [4] [6] , задания Cron должны использовать полный путь:

    @hourly /usr/local/bin/brightness
    
  • Вероятно, задания @reboot Cron не будут работать с текущей версией скрипта [7] .

5 голосов
/

Вместо того, чтобы писать задания cron для ручного изменения яркости дисплея, вы можете взглянуть на redshift , программу, которая может сделать именно это. Он может быть настроен на отслеживание дневного света в вашем регионе и изменение яркости дисплея и цветовой температуры для лучшего соответствия естественному освещению.

Image illustrating the effect of redshift

Его основной пункт продажи - изменение цветовой температуры (то есть смещение цвета в сторону красного, откуда и происходит название), но он также может регулировать яркость. Вы можете настроить его на яркость, если вы этого хотите.

Основное преимущество по сравнению с ручным решением заключается в том, что красное смещение изменяет цвет / яркость постепенно, в соответствии с текущим ежедневным циклом вашего местоположения, а не по шагам, как с вашим подходом cron. Вы также можете довольно легко включить / выключить эффект; отправка процесса SIGUSR1 переключит эффект. Я сделал связывание клавиш, которое делает killall -USR1 redshift, чтобы сделать это легко доступным.

Существует еще одна программа с похожей функциональностью, которая называется f.lux , которая также поддерживает Windows и MacOS и выглядит довольно популярной. У меня нет опыта с этим, хотя; в частности, я не совсем уверен, может ли он изменить яркость в дополнение к цветовой температуре.

5 голосов
/

Вы должны ввести путь, где установлен xrandr. Тип command -v xrandr (или which xrandr), чтобы знать, где он установлен. Я полагаю, это /usr/bin/xrandr, если он установлен по умолчанию.

Итак, отредактируйте ваш crontab так:

#!/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
0 голосов
/

Другой вариант - использовать xbacklight, если вы используете xrand, например: xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3 эта команда не будет выполнена, если у вас есть VGA выход.

Вы можете установить его с sudo apt install xbacklight. Я использую xbacklight в сотрудничестве с redshift вместе они лучшие.

...