使用 xrandr 和 cron job 调整亮度

使用 xrandr 和 cron job 调整亮度

编辑感谢 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 已触发,但脚本未运行。我做错了什么?

答案1

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,因此它也可以用作 shell 命令。我们假设它被称为brightness

  • 该脚本可以使用参数来覆盖默认亮度值,例如:brightness .9

  • 虽然没有/usr/local/bin列入crontab$PATH variable [1] [4] [6],Cron 作业应该使用完整路径:

    @hourly /usr/local/bin/brightness
    
  • Cron 任务可能@reboot无法与当前版本的脚本兼容 [7]

答案2

你可能需要看看下面的代码,而不是编写 cron 任务来手动更改显示器亮度:红移,一款可以做到这一点的程序。它可以设置为跟踪您所在位置的日光,并改变显示器的亮度和色温,以更好地匹配自然光。

图像展示了红移的影响

它的主要卖点是改变色温(即将颜色更多地偏向红色,这也是其名称的由来),但它也可以调节亮度。如果您愿意,可以将其配置为仅调节亮度。

与手动解决方案相比,主要优势在于,红移会逐渐改变颜色/亮度,与您所在位置的当前每日周期相匹配,而不是像 cron 方法那样分步改变。您还可以相当轻松地打开/关闭效果;发送进程 SIGUSR1 将切换效果。我制作了一个键绑定,使killall -USR1 redshift此功能易于访问。

还有另一个具有类似功能的程序叫做勒克斯,它也支持 Windows 和 MacOS,似乎相当受欢迎。不过我没有用过;特别是我不太确定它除了色温之外是否还能改变亮度。

答案3

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

答案4

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

相关内容