从 udev 规则调用通知发送

从 udev 规则调用通知发送

我使用 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 &

它有效,但它的工作方式非常愚蠢。我的问题是:

  1. 如何获取所连接设备的实际标题,与我在lsusb输出中看到的相同?目前,我刚刚收到“插入”和“拔出”等通知,并且我找不到如何在我的 udev 规则中检索设备的名称(如果可以,那么我会将其作为范围)
  2. 目前,激活的通知过多。比如说,当我连接 U 盘时,我收到了大约 15 条通知!但是,如果我运行lsusb,附加的 USB 记忆棒将显示为单个设备。所以,看来我应该向规则过滤器添加更多参数,但我找不到它。
  3. 也许有更好的设备插入/拔出通知解决方案?如果您知道的话请提出建议。

答案1

好吧,经过几个小时的谷歌搜索和在论坛上询问后,我让它工作了(看起来)。任何想要在插入/拔出某些 USB 设备时获得良好的视觉和/或音频通知的人都可以安装我的脚本,请参阅下面的安装详细信息。

首先回答一下我自己的问题。

lsusb1.如何获取所连接设备的实际标题,与我在输出中看到的相同?

内核中没有这样的标题(通常情况下)。有一个数据库文件,其中包含许多对的标题vendor_id:product_id,它通常是/usr/share/hwdata/usb.ids文件。该数据库可以通过 进行更新/usr/sbin/update-usbids.sh。感谢来自linux.org.ru对于该信息。

我不知道是否有一些特殊的工具可以按对获取设备标题vendor_id:product_id,所以我不得不用lsusband进行一些修改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作为显示管理器。

(从这个帖子

相关内容