從 udev 規則呼叫 notify-send
我使用 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 &
它有效,但它非常愚蠢。我的問題是:
- 如何獲得附加設備的實際標題,與我在
lsusb
輸出中看到的一樣?目前,我剛剛收到“plugged”和“unpugged”之類的通知,我找不到如何在我的 udev 規則中檢索設備的名稱(如果可以,那麼我會將它作為範圍)- 目前,啟動的通知過多。比如說,當我連接我的 U 盤時,我收到了大約 15 條通知!但是,如果我執行
lsusb
,附加的 USB 記憶棒僅顯示為單個設備。所以,似乎我應該向規則過濾器添加更多參數,但我找不到它。- 設備插入/拔出通知可能有更好的解決方案?如果您知道的話,請提出建議。
好吧,經過數小時的Google搜尋和論壇上的詢問,我得到了它的工作(似乎)。任何想要在插入/拔出某些 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
and破解一下grep
:例如,lsusb | grep '0458:003a'
2. 目前啟動的通知過多。比如說,當我連接我的 U 盤時,我收到了大約 15 條通知!
我必須承認我還沒有弄清楚如何為此編寫規則,但我找到了另一種過濾它的方法。
udev
允許我們對 : 進行一些替換:例如,我們可以分別通過和RUN+="..."
獲取匯流排號和設備號。首先,在我的腳本中,我將附加設備列表儲存在特殊文件中,這樣如果腳本得到新的“plug”事件,並且該設備的 busnum 和 devnum 已經儲存在我們的文件中,則不會生成通知。其次,這些替換通常僅適用於“系列”事件中的一種設備。但無論如何,解釋算法在任何情況下都應該解決它。$attr{busnum}``$attr{devnum}``$attr{busnum}``$attr{devnum}
目前項目頁面:my-udev-notify。
它看起來像這樣:
安裝細節。
在 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 了解詳細資訊。