GNU/Linux >> Linux の 問題 >  >> Ubuntu

XrandrとCronJobで明るさを調整しますか?

編集 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

cronジョブがトリガーされますが、スクリプトは実行されません。何が間違っているのですか?

ベストアンサー

Cronは、デフォルトで限られた環境変数のセットを提供します。 xrandrを取得するには Cronジョブを実行するには、現在のユーザーの$DISPLAYの値をエクスポートする必要があります 変数。これを行うには、スクリプトの先頭に次の行を追加します(または、crontab内に追加します)。 ファイル):

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
  • スクリプトは、アクティブなモニターのリストを自動的に取得できます。 2台のモニターでテストしました。

  • 実行可能ファイルを/usr/local/binに配置することをお勧めします。 、したがって、シェルコマンドとしても使用できます。それがbrightnessと呼ばれていると仮定しましょう 。

  • スクリプトは引数を使用できます。これにより、デフォルトの明るさの値が上書きされます。例:brightness .9

  • /usr/local/bin crontabにリストされていません の$PATH variable 、cronジョブはフルパスを使用する必要があります:

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

関連:パッケージがデブとスナップの両方として利用できる場合、どちらの方法が好ましいですか?
Ubuntu
  1. Notify-Send With Cronを使用していますか?

  2. 1つの画面だけを回転させますか?

  3. Xrandrで接続されているモニターを一覧表示するにはどうすればよいですか?

  1. cronジョブが実行されていませんか?

  2. cronジョブの使用とポリシー

  3. cronジョブの操作– cPanelを使用してそれらを作成、編集、削除します

  1. fgおよびbgコマンドを使用してLinuxバックグラウンドジョブを管理する方法

  2. 1時間10分ごとにcronジョブを実行する方法

  3. 通知送信によるcron