Повідомлення про виклик-відправлення від правила udev


13

Я використовую 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"

І два сценарії:

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виході? Наразі я щойно отримував сповіщення типу "підключений" та "відключений", і я не можу знайти, як я можу отримати назву пристрою в моєму правилі udev (якщо я можу, то передавав би його до свого сценарію як параметр)
  2. Наразі активовано занадто багато сповіщень. Скажіть, коли я прикладаю USB-накопичувач, я отримав близько 15 повідомлень! Але якщо я запускаю lsusb, прикріплений USB-накопичувач відображається як лише один пристрій. Тож, мабуть, я повинен додати ще один аргумент, щоб правити фільтр, але я не можу його дізнатися.
  3. Можливо, є якесь краще рішення для сповіщень про підключення / відключення пристрою? Підкажіть, будь ласка, якщо ви щось знаєте.

Відповіді:


9

Ну, після багатьох годин гуглінгу та запитань на форумах, я налагодила це (здається). Кожен, хто хоче отримати приємне візуальне та / або аудіоповідомлення, коли якийсь 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}відповідно. По-перше, у своєму сценарії я зберігаю список доданих пристроїв у спеціальному файлі, так що якщо скрипт отримав нову подію "plug", а busnum та devnum цього пристрою вже зберігаються у нашому файлі, повідомлення не генерується. А по-друге, ці заміни $attr{busnum}і $attr{devnum}зазвичай доступні лише для одного з пристроїв із "серії" подій. Але так чи інакше, пояснений алгоритм повинен розібратися в будь-якому випадку.


Поточна сторінка проекту: my-udev-notify .

Це виглядає приблизно так:

введіть тут опис зображення

Деталі встановлення

Випробуваний на Linux Mint 13, я вважаю, що він повинен працювати на Ubuntu та інших похідних Ubuntu, і я сподіваюся, що він буде працювати в будь-якій * nix системі udev.

  • Перейдіть на сторінку проекту , дістаньте звідси джерела і кудись їх покладіть. У ньому є лише один головний сценарій:, 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). При другому завантаженні повідомлення не буде (якщо ви не підключите новий пристрій, коли система вимкнена)

Ви можете налаштувати його (увімкнути / вимкнути візуальні та звукові сповіщення або змінити звуки), перевірити readme.txt в архіві для отримання деталей.


Можливо, вам слід поглянути на це питання / відповідь: stackoverflow.com/questions/469243/… Він використовується pyudevдля отримання сповіщення, і не вимагає додаткових сценаріїв у /etc/udev.
Denilson Sá Maia

Чи сповіщення про підключення пристрою чи відключення пристрою приховано / недоступно за замовчуванням?
gonzobrains

1
@gonzobrains, ні, як тільки ви додали правильні правила до /etc/udeve/rules.d, він повинен працювати для нещодавно приєднаних пристроїв.
Дмитро Френк

@DmitryFrank Що я мав на увазі - це ці сповіщення автоматично відображаються за замовчуванням або вам потрібно виконати вищезазначені дії, щоб їх показати? Для свого проекту я хотів би придушити їх (тобто не мати сповіщень, показаних за замовчуванням).
gonzobrains

1
@gonzobrains, якщо ви не виконали описані вище дії, і у вас з’являються сповіщення під час підключення / відключення будь-якого пристрою, то мій сценарій не має нічого спільного з цим. Якась інша програма робить це за вас.
Дмитро Френк

0

Додайте наступні рядки перед рядками візуального сповіщення, щоб дати сценарію уявлення про те, на якому X відображенні він повинен запускати notify-send(або будь-який інший додаток X):

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

Звичайно, ви повинні змінити другий рядок відповідно до вашого робочого середовища (або диспетчера дисплеїв). Цей рядок відмінно працює для Ubuntu 16.04, який використовує єдність як робочий стіл, а lightdm як менеджер дисплеїв.

цієї публікації )


0
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 - ідентифікатор групи користувача

наприклад bigbird і 1000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.