![从 udev 规则调用通知发送](https://linux22.com/image/94152/%E4%BB%8E%20udev%20%E8%A7%84%E5%88%99%E8%B0%83%E7%94%A8%E9%80%9A%E7%9F%A5%E5%8F%91%E9%80%81.png)
我使用 Linux Mint 13 MATE,并且尝试在插入/拔出设备时设置通知。
首先,我发现udev-通知包,但不幸的是它几乎对我不起作用:它工作的时间很短(1-2分钟),然后,如果我连接/断开任何设备,它就会崩溃:
Traceback (most recent call last):
File "./udev-notify.py", line 319, in <module>
notification.show()
glib.GError: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name :1.1061 was not provided by any .service files
我没有找到任何解决方案,所以我必须将其删除。 (提交错误报告还)
令人惊讶的是,到目前为止我还没有找到类似的实用程序。然后我尝试编写应该匹配所有设备的 udev 规则。我添加了新文件/etc/udev/rules.d/notify.rules
:
ACTION=="add", RUN+="/bin/bash /home/dimon/tmp/device_plug.sh"
ACTION=="remove", RUN+="/bin/bash /home/dimon/tmp/device_unplug.sh"
还有两个脚本:
device_plug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device plugged"
/usr/bin/play -q /path/to/plug_sound.wav &
device_unplug.sh:
#!/bin/bash
export DISPLAY=":0"
notify-send "device unplugged"
/usr/bin/play -q /path/to/unplug_sound.wav &
它有效,但它的工作方式非常愚蠢。我的问题是:
- 如何获取所连接设备的实际标题,与我在
lsusb
输出中看到的相同?目前,我刚刚收到“插入”和“拔出”等通知,并且我找不到如何在我的 udev 规则中检索设备的名称(如果可以,那么我会将其作为范围) - 目前,激活的通知过多。比如说,当我连接 U 盘时,我收到了大约 15 条通知!但是,如果我运行
lsusb
,附加的 USB 记忆棒将显示为单个设备。所以,看来我应该向规则过滤器添加更多参数,但我找不到它。 - 也许有更好的设备插入/拔出通知解决方案?如果您知道的话请提出建议。
答案1
好吧,经过几个小时的谷歌搜索和在论坛上询问后,我让它工作了(看起来)。任何想要在插入/拔出某些 USB 设备时获得良好的视觉和/或音频通知的人都可以安装我的脚本,请参阅下面的安装详细信息。
首先回答一下我自己的问题。
lsusb
1.如何获取所连接设备的实际标题,与我在输出中看到的相同?
内核中没有这样的标题(通常情况下)。有一个数据库文件,其中包含许多对的标题vendor_id:product_id
,它通常是/usr/share/hwdata/usb.ids
文件。该数据库可以通过 进行更新/usr/sbin/update-usbids.sh
。感谢来自linux.org.ru对于该信息。
我不知道是否有一些特殊的工具可以按对获取设备标题vendor_id:product_id
,所以我不得不用lsusb
and进行一些修改grep
:例如,lsusb | grep '0458:003a'
2. 目前激活的通知过多。比如说,当我连接 U 盘时,我收到了大约 15 条通知!
我必须承认我还没有弄清楚如何为此编写规则,但我找到了另一种可以过滤它的方法。
udev
允许我们使用一些替换:例如,我们可以分别通过和RUN+="..."
获取总线号和设备号。首先,在我的脚本中,我将附加设备的列表存储在特殊文件中,这样,如果脚本获得新的“插入”事件,并且该设备的busnum和devnum已经存储在我们的文件中,则不会生成通知。其次,这些替换通常仅适用于“系列”事件中的一个设备。但无论如何,解释的算法无论如何都应该解决它。$attr{busnum}
$attr{devnum}
$attr{busnum}
$attr{devnum}
当前项目页面:my-udev-通知。
它看起来像这样:
安装细节。
在 Linux Mint 13 上进行了测试,我相信它应该可以在 Ubuntu 和其他 Ubuntu 的衍生版本上运行,并且我希望它可以在任何带有udev
.
- 去项目页面,从那里获取资源并将它们放在某个地方。其中只有一个主要脚本:
my-udev-notify.sh
,但存档还包含插入/拔出通知的声音,以及一些更多信息,请参阅readme.txt
参考资料 。 - 创建
/etc/udev/rules.d/my-udev-notify.rules
包含以下内容的文件:(不要忘记将路径修改为解压后的真实路径my-udev-notify.sh
!)
ACTION=="add", RUN+="/bin/bash /path/to/my-udev-notify.sh -a add -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
ACTION=="remove", RUN+="/bin/bash /path/to/my-udev-notify.sh -a remove -p '%p' -b '$attr{busnum}' -d '$attr{devnum}'"
此后,它应该适用于新连接的设备。也就是说,如果您拔掉某些设备,您将不会收到通知。但当你把它插回去时,你会的。 (是的,对我来说,它无需重新启动任何 udev 即可工作。如果不适合您,请尝试重新启动)
要使其适用于所有设备,只需重新启动系统即可。请注意,首次启动期间可能会出现许多通知(请参阅 中的已知问题readme.txt
)。第二次启动时,不会有任何通知(除非您在系统关闭时插入新设备)
您可以对其进行自定义(打开/关闭视觉和声音通知,或更改声音),请查看存档中的 readme.txt 以了解详细信息。
答案2
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!'
其中 X_user 是您要运行的用户,X_userid 是用户的组 ID
示例 bigbird 和 1000
答案3
在可视通知行之前添加以下行,以使脚本了解应在哪个 X 显示器上运行notify-send
(或任何其他 X 应用程序):
export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority
当然,您必须根据您的桌面环境(或显示管理器)更改第二行。这条线适用于使用 unity 作为桌面的 Ubuntu 16.04光DM作为显示管理器。
(从这个帖子)