编辑感谢 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
答案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