Отрегулируйте яркость с помощью задания xrandr и cron

EDIT Благодаря 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 запускается, но сценарий не запускается. Что я делаю неправильно?

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

12 ответов

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

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

Ссылки:

Crontab и C программа, которая должна быть выполнена в окне терминала. Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

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

#!/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
Программа Crontab и C, которая должна быть запущена в окно терминала

Crontab и C, которые должны быть выполнены в терминальное окно

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

[ f3] Вероятно, задания @reboot Cron не будут работать с текущей версией скрипта [7].
7
ответ дан 22 May 2018 в 18:14
  • 1
    Отлично, @ pa4080! Вы долго будете решать вопрос, который у меня есть о DISPLAY ... – Redbob 22 September 2017 в 13:23

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

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

Ссылки:

Crontab и C программа, которая должна быть выполнена в окне терминала. Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

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

#!/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 Программа Crontab и C, которая должна быть запущена в окно терминала

Crontab и C, которые должны быть выполнены в терминальное окно

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

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

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

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

Ссылки:

Crontab и C программа, которая должна быть выполнена в окне терминала. Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

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

#!/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 Программа Crontab и C, которая должна быть запущена в окно терминала

Crontab и C, которые должны быть выполнены в терминальное окно

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

Как программно найти текущее значение DISPLAY, когда DISPLAY не установлен?

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

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

Итак, отредактируйте yout 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
ответ дан 22 May 2018 в 18:14
  • 1
    Здесь не проблема, потому что xrandr фактически находится в /usr/bin/, , но значением по умолчанию crontab $PATH по умолчанию является /usr/bin:/bin. – pa4080 22 September 2017 в 11:36
  • 2
    спасибо за предложение, но он не работает :( – Piney 26 September 2017 в 10:28
  • 3
    Пинни, ты следил за инструкциями pa4080? Думаю, они вам помогут. В противном случае я установил Redshift, как предположил Марсельм, он работает как шарм. – Redbob 26 September 2017 в 16:53

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

redshift

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

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

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

4
ответ дан 22 May 2018 в 18:14
  • 1
    Это решение действительно @marcelm, кроме того, Piney не сообщал об убунту и отпуске. Хорошо проверить, будет ли он работать над этим. Работает ли красное смещение с запланированным временем для изменения настроек? – Redbob 22 September 2017 в 15:18
  • 2
    @Redbob Насколько я знаю, redshift не может изменять настройки в «запланированные времена», но только отслеживать солнечный свет. Он делает это, вычисляя положение солнца на основе вашего местоположения и времени. Поэтому мой ответ - скорее альтернатива; попытка ответить на ОП, лежащие в основе желания, а не на его точный вопрос. – marcelm 22 September 2017 в 16:25
  • 3
    Отлично, @marcelm. Поймайте мой голос ... Я установил на свой компьютер (lubuntu), но он ищет «geoclue2» и не будет продолжать. Моя сеть проксирована, поэтому я могу ее запустить. – Redbob 22 September 2017 в 16:43
  • 4
    Мне не нужна другая цветовая температура, иначе я бы использовал одну из многих программ, которые уже делают это. – Piney 26 September 2017 в 10:28

Другим вариантом было бы использовать 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
ответ дан 22 May 2018 в 18:14
  • 1
    Привет, Urosjarc, как мы можем использовать эти функции? Пожалуйста, уточните свой ответ и укажите пример использования. – pa4080 29 September 2017 в 11:35

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

красное смещение

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

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

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

4
ответ дан 18 July 2018 в 06:26

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

Итак, отредактируйте yout 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
ответ дан 18 July 2018 в 06:26

Другим вариантом было бы использовать 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
ответ дан 18 July 2018 в 06:26

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

redshift

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

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

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

4
ответ дан 24 July 2018 в 18:36
  • 1
    Это решение действительно @marcelm, кроме того, Piney не сообщал об убунту и отпуске. Хорошо проверить, будет ли он работать над этим. Работает ли красное смещение с запланированным временем для изменения настроек? – Redbob 22 September 2017 в 15:18
  • 2
    @Redbob Насколько я знаю, redshift не может изменять настройки в «запланированные времена», но только отслеживать солнечный свет. Он делает это, вычисляя положение солнца на основе вашего местоположения и времени. Поэтому мой ответ - скорее альтернатива; попытка ответить на ОП, лежащие в основе желания, а не на его точный вопрос. – marcelm 22 September 2017 в 16:25
  • 3
    Отлично, @marcelm. Поймайте мой голос ... Я установил на свой компьютер (lubuntu), но он ищет «geoclue2» и не будет продолжать. Моя сеть проксирована, поэтому я могу ее запустить. – Redbob 22 September 2017 в 16:43
  • 4
    Мне не нужна другая цветовая температура, иначе я бы использовал одну из многих программ, которые уже делают это. – Piney 26 September 2017 в 10:28

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

Итак, отредактируйте yout 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
ответ дан 24 July 2018 в 18:36
  • 1
    Здесь не проблема, потому что xrandr фактически находится в /usr/bin/, , но значением по умолчанию crontab $PATH по умолчанию является /usr/bin:/bin. – pa4080 22 September 2017 в 11:36
  • 2
    спасибо за предложение, но он не работает :( – Piney 26 September 2017 в 10:28
  • 3
    Пинни, ты следил за инструкциями pa4080? Думаю, они вам помогут. В противном случае я установил Redshift, как предположил Марсельм, он работает как шарм. – Redbob 26 September 2017 в 16:53

Другим вариантом было бы использовать 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
ответ дан 24 July 2018 в 18:36
  • 1
    Привет, Urosjarc, как мы можем использовать эти функции? Пожалуйста, поясните Свой ответ и приведите пример использования. – pa4080 29 September 2017 в 11:35

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

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