첫째: 시스템에서 사용하는 기본 사용자는 루트입니다. 이는
현재 더 잘 구현되지 않은 다른 프로세스 및 기능에 필요합니다
. 운영 체제: 페도라 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
xrandr
sudo 없이도 작동합니다.
내 스크립트에 하나를 추가 했는데 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 없이도 시작할 수 있습니다.