Отрегулируйте яркость с помощью 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}')
Рекомендации:
Программа 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
Скрипт может автоматически получить список активных мониторов. Я проверил это с двумя мониторами.
Хорошая идея - поместить исполняемый файл [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