我试图让一个脚本在每次插入 HDMI 显示器时运行,在阅读了一些资料后,我发现这其中要求我创建 99-monitor-hotplug.rules 并将其放入/etc/udev/rules.d并指定要运行哪个脚本。规则如下:
ACTION=="change", SUBSYSTEM=="drm", ENV{HOTPLUG}=="1", RUN+="/root/hotplug.sh"
好吧,我这样做了,但脚本没有运行。我知道这一点,因为在脚本中我只有:
#!/bin/bash
opera
我故意把脚本写得这么简单,这样我就能看清发生了什么。当我从命令行调用脚本时,Opera 确实运行了。
以下是当我插入和拔出 HDMI 显示器时发生的情况“udevadm 监视器--属性“ 在跑:
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
KERNEL[730.834194] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=1
SEQNUM=3245
SUBSYSTEM=drm
UDEV [730.835499] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=1
SEQNUM=3245
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3217504
KERNEL[738.204082] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
MAJOR=226
MINOR=1
SEQNUM=3246
SUBSYSTEM=drm
UDEV [738.206107] change /devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1 (drm)
ACTION=change
DEVNAME=/dev/dri/card1
DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/drm/card1
DEVTYPE=drm_minor
HOTPLUG=1
ID_FOR_SEAT=drm-pci-0000_01_00_0
ID_PATH=pci-0000:01:00.0
ID_PATH_TAG=pci-0000_01_00_0
MAJOR=226
MINOR=1
SEQNUM=3246
SUBSYSTEM=drm
TAGS=:seat:uaccess:master-of-seat:
USEC_INITIALIZED=3217504
添加规则后,我运行了:sudo udevadm control--reload-rules
有人能帮忙吗?我觉得规则可能不正确,而且我是 udev 规则创建新手。我正在运行 Ubuntu 16.04。
答案1
opera?哦不!RUN
仅适用于短时间运行的任务,udev 在受限环境中运行命令。
不支持 GUI,守护进程在完成事件处理后将被终止。
如果您只想测试规则是否被触发,请尝试以下操作:
#!/bin/bash
date >> /root/myrule.log
参考:man udev
运行{类型}
这只能用于运行时间非常短的前台任务。长时间运行事件进程可能会阻止此设备或相关设备的所有后续事件。
启动守护进程或其他长时间运行的进程对于 udev 来说是不合适的;分叉的进程,无论是否分离,都会在事件处理完成后被无条件终止。
答案2
user.dz 的回答仅第一次对我有用。这种方法每次都对我有用:
KERNEL=="card0", SUBSYSTEM=="drm", ACTION=="change", ENV{DISPLAY}=":0", ENV{XAUTHORITY}="/home/marco/.Xauthority", RUN+="/bin/bash /root/hdmi_hotplug.sh"