xrandr falha quando executado a partir do udev

xrandr falha quando executado a partir do udev

O trecho a seguir de um script Python 3 "myscript" destinado a detectar o layout da tela e atualizá-lo usando xrandr funciona bem quando executado com sudo /usr/local/bin/myscriptou /usr/local/bin/myscript:

xrandr_cmd = Popen("xrandr", shell=True, stdout=PIPE, stderr=STDOUT)

No entanto, quando executado como resultado da seguinte regra do udev:

ACTION="change", SUBSYSTEM="drm", ENV{HOTPLUG}=="1", RUN+="/usr/local/bin/myscript"

ele falha, informando que xrandr retornou 1 com a mensagem "Não é possível abrir a tela".

Alguém sabe por que o xrandr falharia ao ser executado a partir de uma regra do udev?

O roteiro completo, para quem tiver curiosidade:

#! /usr/bin/env python3
import os
from subprocess import Popen, PIPE, STDOUT

def log(s):
    home_dir = os.path.expanduser("~")
    #with open (f"{home_dir}/monitor_script.log", "a+") as f:
    with open (f"/home/vedantroy/monitor_script.log", "a+") as f:
        f.write(s)
xrandr = "/usr/bin/xrandr"
xrandr_cmd = Popen(xrandr, shell=True, stdout=PIPE, stderr=STDOUT)
retval = xrandr_cmd.wait()
lines = map(lambda l: l.decode('ascii'), xrandr_cmd.stdout.readlines())
if retval != 0:
    nl = "\n"
    log(f"xrandr returned {retval} with output:\n{nl.join(lines)}")
else:
    layout_cmds = [
        # No monitors plugged in
        f"{xrandr} --auto",
        # Thinkpad T580
        # Monitor plugged into HDMI port
        # Monitor to right of laptop
        f"{xrandr} --output HDMI2 --primary --auto --right-of eDP1"
    ]
    layout = 0
    for line in lines:
        if "HDMI2 connected" in line:
            layout = 1
            break

    layout_cmd_str = layout_cmds[layout]
    layout_cmd = Popen(layout_cmd_str, shell=True)
    retval = layout_cmd.wait()
    if retval != 0:
        log(f"{layout_cmd_str} returnd {retval}")

Responder1

udev não tem acesso ao X, você deve fornecer a ele a variável de ambiente DISPLAYand :XAUTHORITY

KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/ben/.Xauthority", RUN+="/bin/bash /path/to/script.sh"

(Tirado dehttps://frdmtoplay.com/i3-udev-xrandr-hotplugging-output-switching/)

Claro, você precisa ajustar o caminho do .Xauthorityarquivo e do script.

informação relacionada