Bir udev kuralından notify-send çağrısı


13

Linux Mint 13 MATE kullanıyorum ve aygıtları takarken / çıkarırken bildirimler ayarlamaya çalışıyorum.

Her şeyden önce, udev-notify paketini buldum , ancak ne yazık ki neredeyse benim için çalışmıyor: çok az bir süre (1-2 dakika) çalışıyor ve daha sonra, herhangi bir cihazı bağlar / bağlantısını kesersem çöküyor:

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

Herhangi bir çözüm bulamadım, bu yüzden kaldırmak zorunda kaldım. (dosyalanmış hata raporu da)

Şaşırtıcı bir şekilde, şimdiye kadar bulduğum benzer yardımcı programlar yok. Sonra tüm cihazlarla eşleşmesi gereken udev kuralları yazmaya çalıştım. Yeni dosya ekledim /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"

Ve iki senaryo:

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 &

Çalışıyor, ama çok aptalca çalışıyor. Sorularım:

  1. lsusbÇıkışta görebildiğim gibi, cihazın gerçek başlığı nasıl eklenir ? Şu anda, sadece "takılı" ve "sıkıştırılmamış" gibi bildirimler aldım ve cihazın adını udev kuralımda nasıl alabileceğimi bulamıyorum (Yapabiliyorsam, komut dosyama bir parametre)
  2. Şu anda çok fazla bildirim etkinleştirildi. Diyelim ki USB belleğimi taktığımda yaklaşık 15 bildirim aldım! Ancak, çalışırsam lsusb, takılı USB çubuğu sadece tek bir cihaz olarak görüntülenir. Yani, kural filtresine biraz daha argüman eklemem gerekiyor gibi görünüyor, ama bulamıyorum.
  3. Muhtemelen cihaz tak / çıkar bildirimleri için daha iyi bir çözüm var mı? Bir şey biliyorsanız lütfen önerin.

Yanıtlar:


9

Birkaç saat çalışıp forumlara sorduktan sonra işe koyuldum (öyle görünüyor). Bazı USB aygıtları takıldığında / çıkarıldığında iyi görsel ve / veya sesli bildirim almak isteyen herkes komut dosyamı yükleyebilir, aşağıdaki kurulum ayrıntılarına bakın.

Her şeyden önce, kendi sorularıma cevap veriyor.

1. lsusbÇıkışta görebildiğim gibi, cihazın gerçek başlığı nasıl eklenir ?

Çekirdekte böyle bir başlık yok (yaygın olarak). Birçok çift için başlık içeren bir veritabanı dosyası vardır, vendor_id:product_idgenellikle /usr/share/hwdata/usb.idsdosyadır. Bu veritabanı tarafından güncellenebilir /usr/sbin/update-usbids.sh. Bu bilgi için linux.org.ru'dan gelen çocuklar için teşekkürler .

Cihaz başlığını çift olarak almak için özel bir araç olup olmadığını bilmiyorum vendor_id:product_id, bu yüzden lsusbve ile biraz kesmek zorunda kaldım grep: örneğin,lsusb | grep '0458:003a'

2. Şu anda, çok fazla bildirim etkinleştirildi. Diyelim ki, USB belleğimi taktığımda yaklaşık 15 bildirim aldım!

İtiraf etmeliyim ki bunun için nasıl kural yazacağımı anlayamadım, ancak filtrelememin başka bir yolunu buldum.

udevBize bazı değiştirmelerin kullanmaya olanak sağlar RUN+="...": söz hakkından, biz otobüs numarasını ve cihaz numarasını tarafından alabilirsiniz $attr{busnum}ve $attr{devnum}sırasıyla. İlk olarak, komut dosyamda ekli cihazların listesini özel dosyada saklıyorum, böylece komut dosyası yeni "plug" olayı aldıysa ve bu cihazın busnum ve devnum zaten dosyamızda saklanırsa, bildirim oluşturulmaz. İkincisi, bu sübstitüsyonlar $attr{busnum}ve $attr{devnum}genellikle olayların "serisinden" cihazlardan biri için kullanılabilir. Her neyse, açıklanan algoritma her durumda bunu çözmelidir.


Geçerli proje sayfası: my-udev-notify .

Şöyle görünüyor:

resim açıklamasını buraya girin

Kurulum ayrıntıları.

Linux Mint 13'te test edildi, Ubuntu ve diğer Ubuntu türevleri üzerinde çalışması gerektiğine inanıyorum ve umarım herhangi bir * nix sistemi üzerinde çalışacaktır udev.

  • Git proje sayfasından oradan kaynaklarını almak ve onları bir yere koyun. İçinde sadece bir ana komut dosyası var: my-udev-notify.shancak arşiv ayrıca tak / çıkar bildirimleri için sesler ve daha fazla bilgi içeriyor, readme.txtayrıntılar için bkz .
  • /etc/udev/rules.d/my-udev-notify.rulesAşağıdaki içeriklerle dosya oluşturun : (açtığınız gerçek yolunuzun yolunu değiştirmeyi unutmayın 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}'"

Bundan sonra, yeni takılan cihazlar için çalışmalıdır. Yani, bir cihazın fişini çekerseniz bildirim almazsınız. Ama tekrar taktığınızda çıkarırsınız. (evet, benim için herhangi bir udev yeniden başlatılmadan çalışır. Sizin için değilse, yeniden başlatmayı deneyin)

Tüm cihazlarda çalışmasını sağlamak için sisteminizi yeniden başlatın. İlk önyükleme sırasında çok sayıda bildirim olabileceğini unutmayın (içinde bilinen sorunlara bakın readme.txt). İkinci önyüklemede bildirim olmayacak (sistem kapalıyken yeni bir cihaz takmazsanız)

Özelleştirebilir (görsel ve sesli bildirimleri açabilir / kapatabilir veya sesleri değiştirebilirsiniz), ayrıntılar için arşivdeki readme.txt dosyasını kontrol edebilirsiniz.


Belki bu soru / cevap bakmak gerekir: stackoverflow.com/questions/469243/... O kullanır pyudevbildirim almak ve ekstra komut dosyalarını gerektirmez /etc/udev.
Denilson Sá Maia

Aygıt tak / çıkar bildirimleri varsayılan olarak gizli / kullanılamıyor mu?
gonzobrains

1
@gonzobrains, hayır, /etc/udeve/rules.d dosyasına doğru kuralları eklediğinizde, yeni bağlanan cihazlar için çalışmalıdır.
Dmitry Frank

@DmitryFrank Bu bildirimler varsayılan olarak otomatik olarak gösteriliyordu veya bunları göstermek için yukarıdaki adımları uygulamanız gerekiyor mu? Projem için, onları bastırmak istiyorum (varsayılan olarak hiçbir bildirim gösterilmiyor).
gonzobrains

1
@gonzobrains, yukarıdaki adımları gerçekleştirmediyseniz ve herhangi bir cihazı taktığınızda / çıkardığınızda gösterilen bildirimleriniz varsa, komut dosyamın bununla hiçbir ilgisi yoktur. Başka bir program bunu sizin için yapar.
Dmitry Frank

0

Komut dosyasına hangi X görüntüsünü notify-send(veya başka bir X uygulamasını) çalıştırması gerektiği hakkında fikir vermek için görsel bildirim satırlarınızdan önce aşağıdaki satırları ekleyin :

export DISPLAY=:0
export XAUTHORITY=/var/lib/lightdm/.Xauthority

Tabii ki, ikinci satırı masaüstü ortamınıza (veya ekran yöneticinize) göre değiştirmeniz gerekir. Bu satır, masaüstü olarak birlik ve ekran yöneticisi olarak lightdm kullanan Ubuntu 16.04 için iyi çalışır .

( bu gönderiden )


0
sudo -u X_user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/X_userid/bus notify-send 'Hello world!' 

Burada X_user, çalıştırmak istediğiniz kullanıcı ve X_userid ise kullanıcının grup kimliğidir

örnek bigbird ve 1000

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.