从udev规则呼叫通知发送


13

我使用Linux Mint 13 MATE,并且尝试在插入/拔出设备时设置通知。

首先,我找到了udev-notify软件包,但不幸的是,它几乎对我不起作用:它只用了很少的时间(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输出中看到的一样?目前,我只是收到诸如“ plugged”和“ unpugged”之类的通知,而我找不到在udev规则中如何检索设备名称的信息(如果可以的话,我会将其作为参数)
  2. 当前,激活了太多通知。说,当我连接USB记忆棒时,我收到了大约15条通知!但是,如果我运行lsusb,则连接的USB记忆棒仅显示为单个设备。因此,似乎我应该在规则过滤器中添加更多参数,但是我找不到它。
  3. 可能有一些更好的设备插入/拔出通知解决方案?请提出您是否知道的建议。

Answers:


9

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

首先,回答我自己的问题。

1.如何获得所连接设备的实际标题,就像我在lsusb输出中看到的一样?

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

我不知道是否有一些特殊的工具可以按对获取设备标题vendor_id:product_id,因此我不得不对lsusb和进行修改grep:例如,lsusb | grep '0458:003a'

2.当前,激活了太多通知。说,当我连接USB记忆棒时,我收到了大约15条通知!

我必须承认我还没有弄清楚如何为此编写规则,但是我发现了另一种过滤它的方法。

udev允许我们使用一些替代RUN+="...":例如,我们可以分别通过$attr{busnum}和获得总线号和设备号$attr{devnum}。首先,在脚本中,我将连接设备的列表存储在特殊文件中,这样,如果脚本出现新的“ plug”事件,并且该设备的busnum和devnum已经存储在我们的文件中,则不会生成通知。其次,这些替代$attr{busnum}$attr{devnum}通常只从事件的“系列”的一个设备可用。但是无论如何,解释的算法在任何情况下都应该解决它。


当前项目页面:my-udev-notify

看起来像这样:

在此处输入图片说明

安装细节。

我在Linux Mint 13上进行了测试,我相信它应该可以在Ubuntu和其他Ubuntu衍生产品上运行,并且希望它可以在具有*的任何* nix系统上运行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以获取详细信息。


也许您应该看看这个问题/答案:stackoverflow.com/questions/469243/…它用于pyudev获取通知,并且不需要中的额外脚本/etc/udev
丹尼尔森·萨玛

默认情况下,设备的插拔通知是否隐藏/不可用?
gonzobrains

1
@gonzobrains,不,一旦您在/etc/udeve/rules.d中添加了正确的规则,它就应该适用于新连接的设备。
德米特里·法兰克

@DmitryFrank我的意思是默认情况下会自动显示这些通知,还是您必须执行上述步骤才能显示它们?对于我的项目,我想抑制它们(即默认情况下不显示任何通知)。
gonzobrains 2014年

1
@gonzobrains,如果您尚未执行上述步骤,并且在插入/拔出任何设备时显示通知,则我的脚本与此无关。其他一些程序可以为您完成此任务。
德米特里·弗兰克

0

在可视通知行之前添加以下行,以使脚本了解应该在哪个X显示上运行notify-send(或任何其他X应用程序):

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

当然,您必须根据您的桌面环境(或显示管理器)更改第二行。这行适用于将unity用作桌面并将lightdm用作显示管理器的Ubuntu 16.04 。

(来自此帖子


0
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

例如大鸟和1000

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.