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

РЕДАКТИРОВАТЬ Благодаря 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 ответа

Решение

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"s $PATH variable [1] [4] [6], задания Cron должны использовать полный путь:

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

Вы должны ввести путь, где 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

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

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

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

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

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

echo $(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')не дает вывода в Ubuntu 18.04. Так что я только что сделалecho $DISPLAY внутри скрипта, и результат показал:0, затем я добавилexport DISPLAY=:0и моя работа cron сработала! Мой последний сценарий выглядит так:

#!/bin/bash
# export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')
# echo $DISPLAY
export DISPLAY=:0
xrandr --output $1 --brightness $2
Другие вопросы по тегам