私は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 &
うまくいきますが、その仕組みはとても愚かです。私の質問は次のとおりです
lsusb
出力に見られるものと同じ接続デバイスの実際のヘッダをどのように取得できますか?現在、「接続済み」や「接続解除済み」などの通知のみを受け取り、udevルールからデバイス名を取得する方法が見つかりません(可能であれば範囲にします)。- 現在、多くの通知が有効になっています。たとえば、USBスティックを接続したときに約15個の通知を受け取りました!ただし、を実行すると、
lsusb
接続されたUSBスティックが単一のデバイスとして表示されます。だからルールフィルタにパラメータを追加する必要があるようですが、見つけられません。 - おそらく、デバイスのプラグ/プラグ解除通知のためのより良いソリューションがありますか?ご存知の方おすすめお願いします。
答え1
まあ、数時間インターネット検索をしてフォーラムに質問した後、うまくいくようです。特定のUSBデバイスが接続/分離されたときに良い視覚的および/またはオーディオ通知を受けたい人は誰でも自分のスクリプトをインストールできます。以下のインストールの詳細を参照してください。
まず、私の質問に答えてみましょう。
lsusb
1.出力で見ることができるものと同じ接続デバイスの実際のヘッダーを取得するにはどうすればよいですか?
カーネルには(通常)そのようなヘッダーはありません。複数のペアのヘッダーを含むデータベースファイルがあり、通常はファイルvendor_id:product_id
です。/usr/share/hwdata/usb.ids
データベースは経由で更新できます/usr/sbin/update-usbids.sh
。ありがとうlinux.org.ruこの情報のために。
デバイスのタイトルをペアにインポートする特別なツールがあるかどうかわからないため、andを使用していくつかの修正を行うvendor_id:product_id
必要がありました。たとえば、次のようになります。lsusb
grep
lsusb | 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をご覧ください。
答え2
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!'
ここで、X_user は実行したいユーザー、X_userid はユーザーのグループ ID です。
ビッグバードと1000の例
答え3
notify-send
どのXモニター(または他のXアプリケーション)で実行する必要があるかをスクリプトが知ることができるように、ビジュアル通知行の前に次の行を追加します。
export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority
もちろん、デスクトップ環境(またはディスプレイマネージャ)に応じて2行目を変更する必要があります。この行は、Unityをデスクトップとして使用するUbuntu 16.04用です。光DMディスプレイマネージャとして。
(からこの投稿)