GNU/Linux >> Linux の 問題 >  >> Linux

通知を呼び出す-Udevルールから送信しますか?

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. おそらく、デバイスのプラグ/プラグを抜く通知のためのより良い解決策はありますか?何か知っているかどうか提案してください。

承認された回答:

さて、何時間もグーグルしてフォーラムで質問した後、私はそれを機能させました(そうです)。 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} それぞれ。まず、スクリプトで接続されているデバイスのリストを特別なファイルに保存します。これにより、スクリプトが新しい「プラグ」イベントを取得し、このデバイスのbusnumとdevnumがすでにファイルに保存されている場合、通知は生成されません。次に、これらの置換$attr{busnum} および$attr{devnum} 通常、「一連の」イベントのデバイスの1つでのみ使用できます。しかしとにかく、説明されたアルゴリズムはどんな場合でもそれを整理する必要があります。

関連:Debian –インターネットなしでVPN接続サーバーでインターネットに接続しますか?

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

次のようになります:

インストールの詳細。

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を確認してください。


Linux
  1. コマンドラインから JSON ペイロードを使用して HTTP 要求/呼び出しを行う方法は?

  2. Linux カーネル モジュール内からユーザー空間関数を呼び出す

  3. C++ コードから C 関数を呼び出す

  1. 複数ノードの USB デバイスに一致する Udev ルール

  2. bcache からキャッシュ デバイスを削除するにはどうすればよいですか?

  3. スクリプト言語から Linux syscall を呼び出す

  1. Cloud4RPiを使用してクラウドからRaspberryPiおよびIOTデバイスを制御する

  2. USBフラッシュドライブが接続されていない場合のUdevルール?

  3. Linux – UdevはUsbイーサネットデバイスの名前を変更しませんか?