GNU/Linux >> Belajar Linux >  >> Linux

Panggil Beritahu-kirim Dari Aturan Udev?

Saya menggunakan Linux Mint 13 MATE, dan saya mencoba mengatur notifikasi saat saya mencolokkan/mencabut perangkat.

Pertama-tama, saya menemukan paket udev-notify, tetapi sayangnya itu hampir tidak berfungsi untuk saya:itu bekerja untuk waktu yang sangat sedikit (1-2 menit), dan kemudian, jika saya menghubungkan/memutuskan perangkat apa pun, itu macet:

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

Saya belum menemukan solusi apa pun, jadi saya harus menghapusnya. (mengajukan laporan bug juga)

Anehnya, sejauh ini tidak ada utilitas serupa yang saya temukan. Kemudian saya mencoba menulis aturan udev yang harus cocok dengan semua perangkat. Saya telah menambahkan file baru /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"

Dan dua skrip:

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 &

Ini bekerja, tetapi bekerja sangat bodoh. Pertanyaan saya adalah:

  1. Cara mendapatkan judul sebenarnya dari perangkat yang terpasang, sama seperti yang saya lihat di lsusb keluaran? Saat ini, saya baru saja mendapat notifikasi seperti "plugged" dan "unpugged", dan saya tidak dapat menemukan bagaimana saya dapat mengambil nama perangkat dalam aturan udev saya (Jika saya bisa, maka saya akan meneruskannya ke skrip saya sebagai a parameter)
  2. Saat ini, terlalu banyak notifikasi yang diaktifkan. Katakanlah, ketika saya memasang stik USB saya, saya mendapat sekitar 15 notifikasi! Tapi, jika saya menjalankan lsusb , stik USB yang terpasang ditampilkan hanya sebagai satu perangkat. Jadi, sepertinya saya harus menambahkan beberapa argumen lagi ke filter aturan, tetapi saya tidak dapat menemukannya.
  3. Mungkin ada solusi yang lebih baik untuk pemberitahuan pasang/cabut perangkat? Harap sarankan jika Anda mengetahui sesuatu.

Jawaban yang Diterima:

Nah, setelah berjam-jam googling dan bertanya di forum, saya berhasil (sepertinya). Siapa pun yang ingin mendapatkan pemberitahuan visual dan/atau audio yang bagus ketika beberapa perangkat USB dicolokkan/dicabut dapat menginstal skrip saya, lihat detail pemasangan di bawah.

Pertama-tama, jawab pertanyaan saya sendiri.

1. Cara mendapatkan judul sebenarnya dari perangkat yang terpasang, sama seperti yang saya lihat di lsusb keluaran?

Tidak ada judul seperti itu di kernel (dalam kasus umum). Ada file database dengan judul untuk banyak pasangan vendor_id:product_id , biasanya /usr/share/hwdata/usb.ids mengajukan. Basis data ini dapat diperbarui dengan /usr/sbin/update-usbids.sh . Terima kasih kepada orang-orang dari linux.org.ru untuk info itu.

Saya tidak tahu apakah ada alat khusus untuk mendapatkan judul perangkat dengan memasangkan vendor_id:product_id , jadi saya harus meretas sedikit dengan lsusb dan grep :misalnya, lsusb | grep '0458:003a'

2. Saat ini, terlalu banyak notifikasi yang diaktifkan. Katakanlah, saat saya memasang stik USB, saya mendapat sekitar 15 notifikasi!

Saya harus mengakui bahwa saya belum menemukan cara untuk menulis aturan untuk ini, tetapi saya menemukan cara lain untuk memfilternya.

udev memungkinkan kita untuk menggunakan beberapa substitusi untuk RUN+="..." :katakanlah, kita bisa mendapatkan nomor bus dan nomor perangkat dengan $attr{busnum} dan $attr{devnum} masing-masing. Pertama, dalam skrip saya, saya menyimpan daftar perangkat yang dilampirkan di file khusus, sehingga jika skrip mendapat acara "plug" baru, dan busnum dan devnum perangkat ini sudah disimpan di file kami, maka pemberitahuan tidak dibuat. Dan kedua, substitusi ini $attr{busnum} dan $attr{devnum} biasanya hanya tersedia untuk salah satu perangkat dari "serangkaian" acara. Tapi bagaimanapun, algoritma yang dijelaskan harus menyelesaikannya dalam hal apa pun.

Terkait:Debian – Terhubung ke Internet pada server yang terhubung VPN tanpa Internet?

Halaman proyek saat ini:my-udev-notify.

Tampilannya seperti ini:

Detail pemasangan.

Diuji di Linux Mint 13, saya yakin ini akan berfungsi di Ubuntu dan turunan Ubuntu lainnya, dan saya harap ini akan berfungsi pada sistem *nix apa pun dengan udev .

  • Buka halaman proyek, dapatkan sumber dari sana dan letakkan di suatu tempat. Hanya ada satu skrip utama di dalamnya:my-udev-notify.sh , tetapi arsip juga berisi suara untuk pemberitahuan pasang/cabut, ditambah beberapa info lainnya, lihat readme.txt untuk detailnya.
  • Buat file /etc/udev/rules.d/my-udev-notify.rules dengan konten berikut:(jangan lupa untuk mengubah jalur ke jalur asli tempat Anda membongkar 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}'"

Setelah ini, ini akan berfungsi untuk perangkat yang baru terpasang. Artinya, jika Anda mencabut
beberapa perangkat, Anda tidak akan mendapatkan pemberitahuan. Tetapi ketika Anda memasangnya kembali, Anda akan melakukannya.
(ya, bagi saya ini berfungsi tanpa udev memulai ulang. Jika tidak, coba
reboot)

Untuk membuatnya berfungsi untuk semua perangkat, cukup reboot sistem Anda. CATATAN bahwa mungkin ada
banyak notifikasi selama boot pertama (lihat masalah umum di readme.txt ). Pada boot
kedua, tidak akan ada notifikasi (kecuali Anda mencolokkan perangkat baru saat
sistem mati)

Anda dapat menyesuaikannya (mengaktifkan/menonaktifkan pemberitahuan visual dan suara, atau mengubah suara), periksa readme.txt di arsip untuk mengetahui detailnya.


Linux
  1. Bagaimana cara melakukan HTTP-request/call dengan JSON payload dari command-line?

  2. Memanggil fungsi userspace dari dalam modul kernel Linux

  3. Memanggil fungsi C dari kode C++

  1. Aturan Udev untuk mencocokkan beberapa perangkat USB node

  2. Apakah ada alternatif untuk menggunakan `udev`?

  3. Memanggil syscall Linux dari bahasa scripting

  1. Kontrol Perangkat Raspberry Pi &IOT Dari Cloud Menggunakan Cloud4RPi

  2. Aturan Udev Saat Usb Flash Drive Dicabut?

  3. Linux – Udev Tidak Mengganti Nama Perangkat Ethernet Usb?