X erro BadAccess ao executar o script do cron

0

Estou escrevendo um script simples que deve alterar periodicamente o brilho de todas as telas do sistema. Eu descobri que para isso eu posso usar o seguinte comando:

xrandr --output {display name} --brightness {float in a range [0.0,1.0]}

Primeiro eu queria usar o xbacklight, mas acontece que ele não pode controlar o brilho de todas as telas, então mudei para o xrandr.

Quando eu executo este comando no terminal, ele funciona bem, mas depois eu tentei programá-lo para um crontab para executá-lo periodicamente, primeiro ele não estava funcionando, mas depois descobri que precisava fornecer $DISPLAY env variável para cron para que o script saiba onde procurar por X.

Parece estar funcionando agora, mas não totalmente bem, porque às vezes dá erro assim:

X Error of failed request:  BadAccess (attempt to access private resource denied)
  Major opcode of failed request:  131 (XInputExtension)
  Minor opcode of failed request:  57 ()
  Serial number of failed request:  18
  Current serial number in output stream:  19 

E não consigo entender por que esse erro ocorre e o que fazer para corrigi-lo?

Aqui está o conteúdo do meu arquivo crontab:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/home/user
DISPLAY=:0
XAUTHORITY=/home/user/.Xauthority

0 * * * * python3 /home/user/script.py > /home/user/scriptLog 2>&1

E o script (é executado a cada hora e, a princípio, desliga o teclado e todas as telas por 5 minutos e depois liga):

#!/usr/bin/env python3

import time
import os
import sched

SEC_PER_HOUR = 60 * 60
MIN_PER_HOUR = 60
SEC_PER_MIN = 60
DEVICE_ACTIVE = 139
dur = 5

def xinput_set_prop(devices, prop, val):
    for id in devices:
        os.system("xinput set-prop {} --type=int --format=8 {} {}".format(id, prop, val))

def xrandr_set_brightness(devices, val):
    for id in devices:
        os.system("xrandr --output {} --brightness {}".format(id, val)) 

cur_t = time.time()

if cur_t / SEC_PER_HOUR - cur_t // SEC_PER_HOUR < dur / MIN_PER_HOUR:
    keyboard_ids = [line.replace("\n", "") for line in os.popen("""xinput list | sed -rn 's/.*id=//; s/\s+.*slave\s+keyboard.*//p'""")]
    monitor_ids = [line.replace("\n", "").split(" ")[-1] for line in os.popen("""xrandr --listmonitors""")]

    xrandr_set_brightness(monitor_ids, 0.01)
    xinput_set_prop(keyboard_ids, DEVICE_ACTIVE, 0)

    run_t = cur_t // SEC_PER_HOUR * SEC_PER_HOUR + dur / MIN_PER_HOUR + dur * SEC_PER_MIN
    del_t = run_t - cur_t

    s = sched.scheduler(time.time, time.sleep)
    s.enter(del_t, 1, xinput_set_prop, argument=(keyboard_ids, DEVICE_ACTIVE, 1))
    s.enter(del_t, 1, xrandr_set_brightness, argument=(monitor_ids, 1.0))
    s.run()

Estou usando o Ubuntu 16.04, com a área de trabalho do Unity.

    
por York's 07.12.2017 / 01:00

0 respostas