1

我可以在 99-monitor-hotplug.rules 中获得这个 udev 规则来触发:

ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", 
RUN+="/usr/local/bin/monitor-hotplug.sh"

但我似乎无法让它在 monitor-hotplug.sh 脚本中触发 OpenCV GUI 应用程序。

我从根本上理解 udev 规则以 root 身份运行,但无论我尝试什么语法,我都无法让它在用户级别正确运行以运行应用程序(运行应用程序的实际脚本工作正常)。

我试过 RUN 这种格式:

su - your_X_user_here -c 'export DISPLAY=:0; bash -c "/path/to/script.sh"'

带脚本:

#!/bin/bash
#sleep 5
date >> /var/log/opencvlog.log
cd ~/Downloads
./displayimage /home/<username>/Pictures/picture.png 
>/var/log/application.log 
2>&1

另一种尝试:

将 99-monitor-hotplug.rules 添加到当前语法中:

ACTION=="change", SUBSYSTEM=="drm", ENV{DISPLAY}=":0", 
ENV{XAUTHORITY}="/home/<username>/.Xauthority" ENV{HOTPLUG}=="1", 
RUN+="/usr/local/bin/monitor-hotplug.sh"

然后在实际脚本中:

export DISPLAY=:0
export XAUTHORITY=/home/<username>/.Xauthority
cd ~/Downloads
date 
./displayimage /home/<username>/Pictures/picture.png

这些都不起作用,关于如何使它起作用的任何想法?

谢谢

4

1 回答 1

0

当使用 gdm 之类的显示管理器时,当前的 X 权限文件可能不在用户主目录中,而是在运行时目录中,例如/runor /var/run

您可以尝试以下方法:

USER=<username>
export XAUTHORITY=$(find /var/run/gdm3/ -type f -path "*${USER}*" 2> /dev/null)

较新的 gdm 版本似乎将文件放在更通用的位置:

export XAUTHORITY=$(find /run/user/$(id -u "$USER")/ -name Xauthority 2> /dev/null)

我使用这种技术调用 xrandr 从 udev 规则调整屏幕分辨率:
https ://git.ao2.it/libam7xxx.git/blob/HEAD:/contrib/am7xxx-autodisplay.sh

于 2018-11-26T11:13:56.360 回答