Ajustar o brilho com xrandr e cron job

6

EDIT Graças ao pa4080, adicionei uma linha ao script abaixo e agora funciona muito bem. Eu não entendo exatamente como, oh bem.

Gostaria de fazer um cron job para ajustar meu brilho em diferentes horas do dia. Depois de fazer alguns googling e tentativa e erro eu escrevi o seguinte script bash que funciona bem:

#!/bin/bash
export DISPLAY=$(w $(id -un) | awk 'NF > 7 &&  ~ /tty[0-9]+/ {print ; 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

Então eu usei crontab -e para adicionar a seguinte linha:

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

O cronjob é acionado, mas o script não é executado. O que estou fazendo errado?

    
por Piney 22.09.2017 / 06:56

4 respostas

7

O Cron fornece um conjunto limitado de variáveis de ambiente por padrão [1] . Para obter xrandr para trabalhar com um trabalho Cron, você deve exportar [2] valor da variável $DISPLAY do usuário atual [3] . Para isso, adicione a seguinte linha ao início do script (ou adicione-a ao arquivo crontab [4 ] ):

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

Referências:

Gostei da ideia e já a implementei no meu sistema. Aqui está a minha versão do script acima:

#!/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 &&  ~ /tty[0-9]+/ {print ; 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 ""; 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 ""    # If the scipt is called with an additional argument: 'brightness "<value>"'
fi
  • O script pode obter a lista dos monitores ativos automaticamente. Eu testei com dois monitores.

  • Boa idéia é colocar o arquivo executável [5] em /usr/local/bin , assim estará disponível também como comando shell. Vamos supor que seja chamado de brightness .

  • O script pode usar argumentos, os quais substituirão os valores de brilho padrão, por exemplo: brightness .9 .

  • Embora /usr/local/bin não esteja listado na crontab ' $PATH variable [1] [4] [6] , as tarefas Cron devem usar o caminho completo:

    @hourly /usr/local/bin/brightness
    
  • Provavelmente, as tarefas @reboot Cron não funcionarão com a versão atual do script [7] .

por pa4080 22.09.2017 / 07:18
5

Você deve digitar o caminho onde xrandr está instalado. Tipo command -v xrandr (ou which xrandr ) para saber onde está instalado. Suponho que seja /usr/bin/xrandr , se estiver instalado por padrão.

Então, edite seu crontab assim:

#!/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
    
por Redbob 22.09.2017 / 07:12
4

Em vez de escrever trabalhos agendados para alterar manualmente o brilho de sua tela, convém dar uma olhada no redshift , um programa que pode faça exatamente isso. Ele pode ser configurado para rastrear a luz do dia no local e alterar o brilho e a temperatura da tela para melhor corresponder à luz natural.

Seu principal ponto de venda é alterar a temperatura da cor (ou seja, mudar a cor mais para o vermelho, que é de onde o nome vem), mas também pode ajustar o brilho. Você poderia configurá-lo para fazer apenas o brilho, se é isso que você quer.

A principal vantagem sobre a solução manual é que o redshift muda gradualmente de cor / brilho, combinado com o ciclo diário atual da sua localização, em vez de seguir passos como na sua abordagem cron. Você também pode ligar / desligar o efeito com facilidade; enviar o processo SIGUSR1 alternará o efeito. Fiz uma associação de teclas que faz killall -USR1 redshift para tornar isso acessível.

Existe outro programa de funcionalidade semelhante chamado f.lux , que também suporta Windows e MacOS e parece bastante popular. Eu não tenho experiência com isso; em particular, não tenho certeza se isso pode alterar o brilho, além da temperatura de cor.

    
por marcelm 22.09.2017 / 13:36
0

Outra opção seria usar xbacklight se você usar xrand assim: xrandr --output HDMI-1 --brightness .3 && xrandr --output HDMI-2 --brightness .3 && xrandr --output HDMI-3 --brightness .3 este comando falhará se você tiver VGA output.

Você pode instalá-lo com sudo apt install xbacklight . Eu uso xbacklight com colaboração com redshift juntos eles são os melhores.

    
por urosjarc 29.09.2017 / 08:16