web-dev-qa-db-ja.com

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

Linux Mint 13 MATEを使用していますが、デバイスのプラグを抜き差しするときに通知を設定しようとしています。

まず最初に、私は dev-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. おそらくデバイスのプラグイン/アンプラグ通知のためのより良い解決策がありますか?何かご存知の方はご提案ください。
13
Dmitry Frank

まあ、何時間もグーグルしてフォーラムで質問した後、私はそれを機能させたようです(そうです)。 USBデバイスが差し込まれたり差し込まれたりしたときに、ビジュアルまたはオーディオ、あるいはその両方の通知を受け取りたい場合は、誰でも私のスクリプトをインストールできます。以下のインストールの詳細を参照してください。

まず、自分の質問に答えます。

1。接続されているデバイスの実際のタイトルを取得する方法は、lsusbの出力に表示されるのと同じですか?

カーネルにはそのようなタイトルはありません(一般的なケース)。多くのペアvendor_id:product_idのタイトルを含むデータベースファイルがあり、通常は/usr/share/hwdata/usb.idsファイルです。このデータベースは/usr/sbin/update-usbids.shによって更新できます。 linux.org.r からの情報に感謝します。

vendor_id:product_idのペアでデバイスのタイトルを取得するための特別なツールがあるかどうかわからないため、lsusbgrepを使用して少しハックする必要がありました。たとえば、lsusb | grep '0458:003a'

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

私はこれについてのルールを書く方法を理解していないことを認めなければなりませんが、私はそれをフィルタリングできる別の方法を見つけました。

udevを使用すると、RUN+="..."の代わりに使用できます。たとえば、バス番号とデバイス番号をそれぞれ$attr{busnum}$attr{devnum}で取得できます。最初に、私のスクリプトでは、接続されたデバイスのリストを特殊ファイルに格納します。そのため、スクリプトが新しい「plug」イベントを取得し、このデバイスのbusnumおよびdevnumがすでにファイルに格納されている場合、通知は生成されません。次に、これらの置換$attr{busnum}および$attr{devnum}は、通常、「一連の」イベントのデバイスの1つでのみ使用できます。しかしとにかく、説明されたアルゴリズムはどのような場合でもそれを整理する必要があります。


現在のプロジェクトページ: my-udev-notify

次のようになります。

enter image description here

インストールの詳細。

Linux Mint 13でテストしましたが、Ubuntuおよび他のUbuntuの派生物で動作するはずです。udevを使用する* nixシステムでも動作することを期待しています。

  • プロジェクトページ に移動し、そこからソースを取得して、どこかに配置します。メインスクリプトはmy-udev-notify.shの1つだけですが、アーカイブにはプラグ/アンプラグ通知のサウンドとその他の情報が含まれています。詳細については、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をチェックしてください。

9
Dmitry Frank