udevルールからnotify-sendを呼び出します


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"

そして2つのスクリプト:

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. おそらく、デバイスのプラグ/アンプラグ通知のためのいくつかのより良いソリューションがありますか?何か知っているなら提案してください。

回答:


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ので、私は少しをハックしなければならなかったlsusbgrep、例えば:lsusb | grep '0458:003a'

2.現在、アクティブ化されている通知が多すぎます。USBスティックを取り付けると、約15通の通知が届きました。

このルールの書き方を理解していないことは認めざるを得ませんが、フィルタリングする別の方法を見つけました。

udevを使用して、RUN+="..."バス番号とデバイス番号$attr{busnum}$attr{devnum}それぞれ取得できます。まず、スクリプトでは、接続されたデバイスのリストを特別なファイルに保存します。これにより、スクリプトが新しい「プラグ」イベントを取得し、このデバイスのbusnumとdevnumが既にファイルに保存されている場合、通知は生成されません。そして第二に、これらの置換$attr{busnum}とは、$attr{devnum}イベントだけの「シリーズ」からのデバイスのいずれかで使用されています。しかし、とにかく、説明されたアルゴリズムはどんな場合でもそれを整理する必要があります。


現在のプロジェクトのページ:私の-のudev-通知

次のようになります。

ここに画像の説明を入力してください

インストールの詳細。

Linux Mint 13でテストしましたが、Ubuntuおよびその他のUbuntuの派生製品で動作するはずudevです。また、すべての* nixシステムで動作することを願っています。

  • プロジェクトページに移動し、そこからソースを取得して、どこかに配置します。メインスクリプトは1つだけです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)。2回目の起動時には通知はありません(システムがオフのときに新しいデバイスを接続しない限り)

カスタマイズ(視覚的および音声による通知のオン/オフ、または音声の変更)、詳細についてはアーカイブ内のreadme.txtを確認してください。


たぶん、あなたはこの質問/答えを見る必要があります:stackoverflow.com/questions/469243/…これはpyudev通知を取得するために使用され、で追加のスクリプトを必要としません/etc/udev
デニルソンサマイア14

デバイスのプラグ/アンプラグ通知はデフォルトで非表示/使用不可になっていますか?
gonzobrains 14年

1
@gonzobrains、いいえ、正しいルールを/etc/udeve/rules.dに追加するとすぐに、新しく接続されたデバイスで動作するはずです。
ドミトリーフランク14年

@DmitryFrank私が意図したことは、これらの通知がデフォルトで自動的に表示されることでしたか、それとも表示するには上記の手順を実行する必要がありますか?私のプロジェクトでは、それらを抑制したいと思います(つまり、デフォルトで通知を表示しません)。
gonzobrains

1
@gonzobrains、上記の手順を実行しておらず、デバイスのプラグを抜くときに通知が表示される場合、私のスクリプトはそれとは何の関係もありません。他のプログラムがこれを行います。
ドミトリーフランク14年

0

視覚的な通知行の前に次の行を追加して、スクリプトが実行するXディスプレイnotify-send(または他のXアプリケーション)についてのアイデアをスクリプトに与えます。

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

もちろん、デスクトップ環境(またはディスプレイマネージャー)に応じて2行目を変更する必要があります。この行は、Ubuntu 16.04で正常に機能し、Unityをデスクトップとして使用し、lightdmをディスプレイマネージャーとして使用します。

この投稿から)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.