我可以在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运行的,但是无论我尝试使用哪种语法,我都无法使其在用户级别正常运行以运行应用程序(运行应用程序的实际脚本可以正常工作)。
我已经尝试以这种格式运行:
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
这些都不起作用,对如何使它起作用有任何想法吗?
谢谢
答案 0 :(得分:0)
使用显示管理器(如gdm)时,当前的X授权文件可能不在用户主目录中,而在运行时目录中,例如/run
或/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