Скорректируйте яркость с заданием крона и xrandr

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

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

#!/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 инициирован, но сценарий не работает. Что я делаю неправильно?

6
задан 26 September 2017 в 00:45

4 ответа

Крон обеспечивает ограниченный набор переменных среды значением по умолчанию [1]. Добираться xrandr для работы через задание Крона необходимо экспортировать [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], задания Крона должны использовать полный путь:

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

7
ответ дан 23 November 2019 в 07:18

Необходимо ввести путь, где 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
5
ответ дан 23 November 2019 в 07:18

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

Image illustrating the effect of redshift

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

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

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

5
ответ дан 23 November 2019 в 07:18

Другая опция состояла бы в том, чтобы использовать 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 вместе, они являются лучшими.

0
ответ дан 23 November 2019 в 07:18

Другие вопросы по тегам:

Похожие вопросы: