EDIT pa4080のおかげで、以下のスクリプトに1行追加しましたが、今ではうまく機能します。まあ、どのように私は正確に理解していません。
1日のさまざまな時間に明るさを調整する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はトリガーされますが、スクリプトは実行されません。何が間違っていますか?
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台のモニターでテストしました。
良いアイデアは、実行可能ファイルを配置することです [5] /usr/local/bin
で、シェルコマンドとしても使用できます。 brightness
と呼ばれると仮定しましょう。
スクリプトは、デフォルトの輝度値をオーバーライドする引数を使用できます。例:brightness .9
。
/usr/local/bin
はcrontab
の$PATH variable
にリストされていませんが [1][4][6]、Cronジョブはフルパスを使用する必要があります。
@hourly /usr/local/bin/brightness
おそらく@reboot
Cronジョブはスクリプトの現在のバージョンでは機能しません [7]。
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
Cronジョブを記述してディスプレイの明るさを手動で変更する代わりに、これを正確に行うことができるプログラム redshift をご覧ください。あなたの場所の日光を追跡するように設定し、ディスプレイの明るさと色温度の両方を変更して、自然光によく一致させることができます。
その主なセールスポイントは、色温度を変更することです(つまり、名前の由来である赤の方に色をシフトします)が、明るさを調整することもできます。必要に応じて、明るさだけを実行するように構成できます。
手動による解決策に対する主な利点は、cronのアプローチのように段階的にではなく、赤方偏移が色/明るさを徐々に変化させ、現在の場所の現在のサイクルに合わせていることです。エフェクトのオン/オフをかなり簡単に切り替えることもできます。プロセスSIGUSR1を送信すると、効果が切り替わります。これを簡単にアクセスできるようにするために、killall -USR1 redshift
を実行するキーバインディングを作成しました。
f.Lux と呼ばれる同様の機能を持つ別のプログラムがあります。これはWindowsとMacOSもサポートしており、非常に人気があります。しかし、私はそれを経験していません。特に、色温度に加えて明るさも変更できるかどうかは完全にはわかりません。
別のオプションは、xrandを次のように使用する場合はxbacklight
を使用することです。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
とのコラボレーションとともに使用し、それらが最高です。