スクリプトがudev-ruleによってトリガされた場合、内部systemctlコマンドをsudoとして呼び出す必要があるのはなぜですか?

スクリプトがudev-ruleによってトリガされた場合、内部systemctlコマンドをsudoとして呼び出す必要があるのはなぜですか?

まず、システムで使用するデフォルトユーザーはrootです。これは
、現在よりよく実装されていない他のプロセスや機能に必要です
。オペレーティングシステム:Fedora 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なしで動作します。


私はスクリプトに1つを追加しましたがecho $(whoami)(udevでトリガされていても)rootとして実行されると指定されているので、
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なしで起動できます。

関連情報