스크립트가 udev-rule에 의해 트리거되는 경우 내부 systemctl 명령을 sudo로 호출해야 하는 이유는 무엇입니까?

스크립트가 udev-rule에 의해 트리거되는 경우 내부 systemctl 명령을 sudo로 호출해야 하는 이유는 무엇입니까?

첫째: 시스템에서 사용하는 기본 사용자는 루트입니다. 이는
현재 더 잘 구현되지 않은 다른 프로세스 및 기능에 필요합니다
. 운영 체제: 페도라 35

HDMI 장치가 연결되어 있으면 스크립트를 트리거하는 udev 규칙이 있습니다.

ACTION=="change", SUBSYSTEM=="drm", ENV{DISPLAY}=":0",ENV{XAUTHORITY}="/root/.Xauthority", RUN+="/bin/bash hdmi_hotplug_detection.sh"

스크립트 내부에는 해상도 등을 변경하는 로직이 있습니다.
또한 실행 중인 서비스를 다시 시작하고 싶습니다.- 사용자문맥.

xrandr --output HDMI-1 --auto
/usr/bin/systemctl --user restart daemon.service

udev가 스크립트를 트리거하면 실패합니다.
하지만 내가 전화하면시스템 제어명령은 이를 통해 sudo예상대로 작동합니다 .

xrandr --output HDMI-1 --auto
sudo /usr/bin/systemctl --user restart daemon.service

xrandrsudo 없이도 작동합니다.


내 스크립트에 하나를 추가 했는데 echo $(whoami)(udev에서 트리거되었더라도) 루트로 실행된다고 명시되어 있으므로
sudo가 필요하지 않다고 가정합니까? !

=========

이 동작의 주요 문제는 이 스크립트를 수동으로 또는 pyhton 스크립트를 통해 트리거한다는 것입니다. 이는 다음과 같은 이유로 실패합니다 sudo.

Failed to connect to bus: $DBUS_SESSION_BUS_ADDRESS and $XDG_RUNTIME_DIR not defined (consider using --machine=<user>@.host --user to connect to bus of other user)

이 행동의 이유는 무엇입니까?
왜 필요한가요 sudo?


내 솔루션은 다음과 같습니다

if [[ $1 = "-no-sudo" ]]; then
    systemctl='/usr/bin/systemctl'
else
    systemctl='sudo /usr/bin/systemctl'
fi

$systemctl --user restart daemon.service

따라서 udev는 sudo로 시작하고 sudo 없이도 시작할 수 있습니다.

관련 정보