GNU/Linux >> Belajar Linux >  >> Ubuntu

Sesuaikan Kecerahan Dengan Xrandr Dan Cron Job?

EDIT Berkat pa4080 saya menambahkan satu baris ke skrip di bawah ini dan sekarang berfungsi dengan baik. Saya tidak begitu mengerti caranya, ya.

Saya ingin membuat pekerjaan cron untuk menyesuaikan kecerahan saya pada jam yang berbeda dalam sehari. Setelah melakukan beberapa googling dan coba-coba, saya menulis skrip bash berikut yang berfungsi dengan baik:

#!/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

Kemudian saya menggunakan crontab -e untuk menambahkan baris berikut:

0 * * * * /home/piney/screendimmer.sh

Cronjob dipicu tetapi skrip tidak berjalan. Apa yang saya lakukan salah?

Jawaban Terbaik

Cron menyediakan set variabel lingkungan terbatas secara default. Untuk mendapatkan xrandr untuk mengerjakan tugas Cron, Anda harus mengekspor nilai $DISPLAY pengguna saat ini variabel. Untuk melakukannya tambahkan baris berikut ke awal skrip Anda (atau tambahkan di dalam crontab berkas):

export DISPLAY=$(w $(id -un) | awk 'NF > 7 && $2 ~ /tty[0-9]+/ {print $3; exit}')

Referensi:

  • Program Crontab dan C yang harus dijalankan ke jendela terminal

  • Bagaimana cara menemukan nilai DISPLAY saat ini secara terprogram ketika DISPLAY tidak disetel?

Saya menyukai ide itu dan sudah menerapkannya di sistem saya. Ini versi saya dari skrip di atas:

#!/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
  • Script bisa mendapatkan daftar monitor yang aktif secara otomatis. Saya telah mengujinya dengan dua monitor.

  • Ide yang bagus adalah menempatkan file yang dapat dieksekusi di /usr/local/bin , sehingga akan tersedia juga sebagai perintah shell. Mari kita asumsikan itu disebut brightness .

  • Script dapat menggunakan argumen, yang akan menggantikan nilai kecerahan default, misalnya:brightness .9 .

  • Sementara /usr/local/bin tidak terdaftar di crontab $PATH variable , tugas Cron harus menggunakan jalur lengkap:

    @hourly /usr/local/bin/brightness
    
  • Mungkin @reboot Pekerjaan cron tidak akan berfungsi dengan versi skrip saat ini.

Terkait:Jika sebuah paket tersedia sebagai deb dan snap, metode mana yang lebih disukai?
Ubuntu
  1. Bagaimana Menyesuaikan Pengaturan Layar:Kontras, Saturasi Warna, Dll?

  2. Penggunaan &Kebijakan Pekerjaan Cron

  3. Bekerja dengan pekerjaan cron – buat, edit, dan hapus dengan cPanel

  1. Cara Mengelola Pekerjaan Latar Belakang Linux dengan Perintah fg dan bg

  2. Menggunakan Notify-send Dengan Cron?

  3. Cara menjalankan tugas cron setiap satu jam dan 10 menit

  1. Putar Hanya Satu Layar?

  2. Bagaimana Cara Membuat Daftar Monitor yang Terhubung Dengan Xrandr?

  3. Cron Job Tidak Dijalankan?