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 disebutbrightness
. -
Script dapat menggunakan argumen, yang akan menggantikan nilai kecerahan default, misalnya:
brightness .9
. -
Sementara
/usr/local/bin
tidak terdaftar dicrontab
$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.