用于外部监视器调整的 xrandr 脚本未从 udev 执行

用于外部监视器调整的 xrandr 脚本未从 udev 执行

我的笔记本电脑有 4k 屏幕,还有一个外置 1080p 显示器。显示器上的缩放比例不正确,因此每次插入显示器时,我都会执行 xrandr 命令来修复它。我想我可以自动执行该过程,并创建了一个 udev 规则,当它识别出我的显示器已插入 HDMI 端口时执行该规则。问题是 xrandr 脚本未被执行。我在脚本中 xrandr 命令正上方的文本文件中添加了一个回显,以确保它已达到该点,并且确实如此。我也尝试过使用睡眠命令,但外置显示器只是等待脚本完成睡眠后才打开。手动运行脚本是可行的。

我的udev规则文件如下:

SUBSYSTEM=="drm", ACTION=="change", RUN+="/usr/local/bin/ext_monitor_scale"

xrandr 脚本:

#!/bin/sh
USER_NAME=`who | grep "(:0)" | cut -f 1 -d ' '`
HDMI_STATUS=`cat /sys/class/drm/card0/card0-DP-3/status`

if [ $HDMI_STATUS = "connected" ]
then
        echo "test" >> test.txt
        sudo -u $USER_NAME xrandr --output DP-3 --scale 2x2 --output eDP-1 --scale 0.9999x0.9999
fi

有人知道解决方法吗?看来我需要等待并允许显示器错误地启动,然后让脚本执行 xrandr 命令,但由于显示器在自动调整之前要等待睡眠,所以我不知道该怎么做。谢谢!

答案1

我不知道您是否仍在寻找解决方案,但您的脚本帮助我找到了正确的解决方案。

问题在于您认为有必要以当前登录的用户身份运行它。首先,这没有必要,其次,您执行的方式是错误的,因为对“who”的调用将以 root 身份回复,因为脚本是以 root 身份执行的。

为了解决您的问题,请删除 sudo 并添加正确的显示标识符:

#!/bin/sh
HDMI_STATUS=`cat /sys/class/drm/card1-HDMI-A-1/status`

if [ $HDMI_STATUS = "connected" ]
then
    DISPLAY=:0 /usr/bin/xrandr ...
else
    DISPLAY=:0 /usr/bin/xrandr ...
fi

这对我来说非常有效。

作为奖励,您可以用对 arandr 脚本的调用替换对 xrandr 的调用(arandr 可以将其配置作为脚本保存在 ~/.screenlayout (或您想要的任何位置)中)。通过使用这些脚本,您只需更新它们即可使其在 udev 事件上自动运行。

相关内容