web-dev-qa-db-ja.com

xrandrとcronジョブで明るさを調整します

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はトリガーされますが、スクリプトは実行されません。何が間違っていますか?

6
Piney

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/bincrontab$PATH variableにリストされていませんが [1][4][6]、Cronジョブはフルパスを使用する必要があります。

    @hourly /usr/local/bin/brightness
    
  • おそらく@reboot Cronジョブはスクリプトの現在のバージョンでは機能しません [7]

7
pa4080

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
5
Redbob

Cronジョブを記述してディスプレイの明るさを手動で変更する代わりに、これを正確に行うことができるプログラム redshift をご覧ください。あなたの場所の日光を追跡するように設定し、ディスプレイの明るさと色温度の両方を変更して、自然光によく一致させることができます。

Image illustrating the effect of redshift

その主なセールスポイントは、色温度を変更することです(つまり、名前の由来である赤の方に色をシフトします)が、明るさを調整することもできます。必要に応じて、明るさだけを実行するように構成できます。

手動による解決策に対する主な利点は、cronのアプローチのように段階的にではなく、赤方偏移が色/明るさを徐々に変化させ、現在の場所の現在のサイクルに合わせていることです。エフェクトのオン/オフをかなり簡単に切り替えることもできます。プロセスSIGUSR1を送信すると、効果が切り替わります。これを簡単にアクセスできるようにするために、killall -USR1 redshiftを実行するキーバインディングを作成しました。

f.Lux と呼ばれる同様の機能を持つ別のプログラムがあります。これはWindowsとMacOSもサポートしており、非常に人気があります。しかし、私はそれを経験していません。特に、色温度に加えて明るさも変更できるかどうかは完全にはわかりません。

5
marcelm

別のオプションは、xrandを次のように使用する場合はxbacklightを使用することです。xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3VGA出力がある場合、このコマンドは失敗します。

Sudo apt install xbacklightでインストールできます。私はxbacklightredshiftとのコラボレーションとともに使用し、それらが最高です。

0
user354822