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"

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出力に見られるものと同じ接続デバイスの実際のヘッダをどのように取得できますか?現在、「接続済み」や「接続解除済み」などの通知のみを受け取り、udevルールからデバイス名を取得する方法が見つかりません(可能であれば範囲にします)。
  2. 現在、多くの通知が有効になっています。たとえば、USBスティックを接続したときに約15個の通知を受け取りました!ただし、を実行すると、lsusb接続されたUSBスティックが単一のデバイスとして表示されます。だからルールフィルタにパラメータを追加する必要があるようですが、見つけられません。
  3. おそらく、デバイスのプラグ/プラグ解除通知のためのより良いソリューションがありますか?ご存知の方おすすめお願いします。

ベストアンサー1

まあ、数時間インターネット検索をしてフォーラムに質問した後、うまくいくようです。特定のUSBデバイスが接続/分離されたときに良い視覚的および/またはオーディオ通知を受けたい人は誰でも自分のスクリプトをインストールできます。以下のインストールの詳細を参照してください。

まず、私の質問に答えてみましょう。

lsusb1.出力で見ることができるものと同じ接続デバイスの実際のヘッダーを取得するにはどうすればよいですか?

カーネルには(通常)そのようなヘッダーはありません。複数のペアのヘッダーを含むデータベースファイルがあり、通常はファイルvendor_id:product_idです。/usr/share/hwdata/usb.idsデータベースは経由で更新できます/usr/sbin/update-usbids.sh。ありがとうlinux.org.ruこの情報のために。

デバイスのタイトルをペアにインポートする特別なツールがあるかどうかわからないため、andを使用していくつかの修正を行うvendor_id:product_id必要がありました。たとえば、次のようになります。lsusbgreplsusb | grep '0458:003a'

2. 現在アクティブな通知が多すぎます。たとえば、USBスティックを接続したときに約15個の通知を受け取りました!

これに対するルールの作成方法が見つからなかったことを認めなければなりません。しかし、それをフィルタリングする別の方法を見つけました。

udevいくつかの代替項目が利用可能です。たとえば、それぞれを介してRUN+="..."バス番号とデバイス番号を取得できます。まず、私のスクリプトは接続されたデバイスのリストを特別なファイルに保存します。スクリプトは新しい「挿入」イベントを受け取り、デバイスのバス番号とデバイス番号がすでにファイルに保存されている場合に通知を生成します。第二に、これらの交換は通常、「一連の」イベントの1つのデバイスにのみ適用されます。しかし、とにかく説明されたアルゴリズムはとにかくそれを解決しなければなりません。$attr{busnum}$attr{devnum}$attr{busnum}$attr{devnum}


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

次のようになります。

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

インストールの詳細。

Linux Mint 13でテストした結果、Ubuntuや他のUbuntu派生製品で動作すると思いますudev

  • 行くプロジェクトページ、そこから資源を持って来、どこかに置きなさい。デフォルトのスクリプトは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をご覧ください。

おすすめ記事