Gọi thông báo-gửi từ một quy tắc udev


13

Tôi sử dụng Linux Mint 13 MATE và tôi đang cố gắng thiết lập thông báo khi tôi cắm / rút phích cắm thiết bị.

Trước hết, tôi tìm thấy gói thông báo udev , nhưng thật không may, nó gần như không hoạt động với tôi: nó hoạt động trong thời gian rất ngắn (1-2 phút), và sau đó, nếu tôi kết nối / ngắt kết nối bất kỳ thiết bị nào, nó sẽ gặp sự cố:

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

Tôi không tìm thấy bất kỳ giải pháp nào, vì vậy tôi phải loại bỏ nó. (cũng đã nộp bugreport )

Đáng ngạc nhiên, cho đến nay không có tiện ích tương tự tôi tìm thấy. Sau đó, tôi đã cố gắng viết các quy tắc udev phải phù hợp với tất cả các thiết bị. Tôi đã thêm tệp mới /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"

Và hai kịch bản:

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 &

Nó hoạt động, nhưng nó hoạt động rất ngu ngốc. Câu hỏi của tôi là:

  1. Làm cách nào để có được tiêu đề thực tế của thiết bị được đính kèm, giống như tôi có thể thấy ở lsusbđầu ra? Hiện tại, tôi vừa nhận được thông báo như "đã cắm" và "chưa được cắm" và tôi không thể tìm thấy làm cách nào tôi có thể truy xuất tên của thiết bị theo quy tắc udev của mình (Nếu tôi có thể, thì tôi sẽ chuyển nó vào tập lệnh của mình dưới dạng tham số)
  2. Hiện tại, quá nhiều thông báo được kích hoạt. Giả sử, khi tôi gắn USB, tôi nhận được khoảng 15 thông báo! Nhưng, nếu tôi chạy lsusb, thanh USB đính kèm được hiển thị dưới dạng một thiết bị duy nhất. Vì vậy, có vẻ như tôi nên thêm một số đối số vào bộ lọc quy tắc, nhưng tôi không thể tìm ra nó.
  3. Có lẽ có một số giải pháp tốt hơn cho các thông báo cắm / rút thiết bị? Xin đề nghị nếu bạn biết một cái gì đó.

Câu trả lời:


9

Chà, sau nhiều giờ googling và hỏi trên các diễn đàn, tôi đã làm cho nó hoạt động (có vẻ như). Bất cứ ai muốn nhận thông báo hình ảnh và / hoặc âm thanh đẹp khi một số thiết bị USB được cắm / rút phích cắm đều có thể cài đặt tập lệnh của tôi, xem chi tiết cài đặt bên dưới.

Trước hết, câu trả lời cho câu hỏi của riêng tôi.

1. Làm thế nào để có được tiêu đề thực tế của thiết bị được đính kèm, giống như tôi có thể thấy ở lsusbđầu ra?

Không có tiêu đề như vậy trong kernel (trong trường hợp phổ biến). Có một tệp cơ sở dữ liệu với các tiêu đề cho nhiều cặp vendor_id:product_id, đó thường là /usr/share/hwdata/usb.idstệp. Cơ sở dữ liệu này có thể được cập nhật bởi /usr/sbin/update-usbids.sh. Cảm ơn những người từ linux.org.ru cho thông tin đó.

Tôi không biết có một số công cụ đặc biệt để nhận tiêu đề thiết bị theo cặp hay không vendor_id:product_id, vì vậy tôi đã phải hack một chút với lsusbgrep: ví dụ:lsusb | grep '0458:003a'

2. Hiện tại, quá nhiều thông báo được kích hoạt. Giả sử, khi tôi gắn USB, tôi nhận được khoảng 15 thông báo!

Tôi phải thừa nhận rằng tôi đã không tìm ra cách viết quy tắc cho việc này, nhưng tôi đã tìm thấy một cách khác để tôi có thể lọc nó.

udevcho phép chúng ta sử dụng một số thay cho RUN+="...": tiếng nói, chúng tôi có thể nhận được số xe buýt và số điện thoại bằng cách $attr{busnum}$attr{devnum}tương ứng. Đầu tiên, trong tập lệnh của tôi, tôi lưu trữ danh sách các thiết bị đính kèm trong tệp đặc biệt, để nếu tập lệnh có sự kiện "cắm" mới, và busnum và devnum của thiết bị này đã được lưu trong tệp của chúng tôi, thì thông báo sẽ không được tạo. Và thứ hai, những sự thay thế này $attr{busnum}$attr{devnum}thường chỉ có sẵn cho một trong các thiết bị từ "chuỗi" sự kiện. Nhưng dù sao, thuật toán giải thích nên sắp xếp nó trong mọi trường hợp.


Trang dự án hiện tại: my-udev-notify .

Nó trông như thế này:

nhập mô tả hình ảnh ở đây

Chi tiết lắp đặt.

Đã thử nghiệm trên Linux Mint 13, tôi tin rằng nó sẽ hoạt động trên Ubuntu và các dẫn xuất khác của Ubuntu và tôi hy vọng nó sẽ hoạt động trên mọi hệ thống * nix với udev.

  • Tới trang dự án , lấy nguồn từ đó và đặt chúng ở đâu đó. Chỉ có một tập lệnh chính trong đó: my-udev-notify.shnhưng lưu trữ cũng chứa âm thanh cho thông báo cắm / rút phích cắm, cùng với một số thông tin khác, xem readme.txtđể biết chi tiết.
  • Tạo tệp /etc/udev/rules.d/my-udev-notify.rulesvới nội dung sau: (đừng quên sửa đổi đường dẫn thành đường dẫn thực của bạn nơi bạn đã giải né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}'"

Sau này, nó sẽ hoạt động cho các thiết bị mới được đính kèm. Đó là, nếu bạn rút phích cắm một số thiết bị, bạn sẽ không nhận được thông báo. Nhưng khi bạn cắm lại, bạn sẽ làm được. (vâng, đối với tôi nó hoạt động mà không cần khởi động lại udev. Nếu nó không phù hợp với bạn, hãy thử khởi động lại)

Để làm cho nó hoạt động cho tất cả các thiết bị, chỉ cần khởi động lại hệ thống của bạn. LƯU Ý rằng có thể có nhiều thông báo trong lần khởi động đầu tiên (xem các sự cố đã biết trong phần readme.txt). Khi khởi động lần thứ hai, sẽ không có thông báo (trừ khi bạn cắm thiết bị mới khi tắt hệ thống)

Bạn có thể tùy chỉnh nó (bật / tắt thông báo hình ảnh và âm thanh hoặc thay đổi âm thanh), kiểm tra readme.txt trong kho lưu trữ để biết chi tiết.


Có lẽ bạn nên xem câu hỏi / câu trả lời này: stackoverflow.com/questions/469243/NH Nó sử dụng pyudevđể nhận thông báo và không yêu cầu thêm tập lệnh /etc/udev.
Denilson Sá Maia

Các thông báo cắm / rút phích cắm của thiết bị có bị ẩn / không khả dụng theo mặc định không?
gonzobrains

1
@gonzobrains, không, ngay khi bạn thêm quy tắc chính xác vào /etc/udeve/rules.d, nó sẽ hoạt động cho các thiết bị mới được đính kèm.
Dmitry Frank

@DmitryFrank Ý tôi là những thông báo này được tự động hiển thị theo mặc định hay bạn phải thực hiện các bước trên để hiển thị chúng? Đối với dự án của tôi, tôi muốn loại bỏ chúng (nghĩa là không có thông báo nào được hiển thị theo mặc định).
gonzobrains

1
@gonzobrains, nếu bạn chưa thực hiện các bước trên và bạn có thông báo hiển thị khi bạn cắm / rút phích cắm bất kỳ thiết bị nào, thì tập lệnh của tôi không liên quan gì đến nó. Một số chương trình khác làm điều này cho bạn.
Dmitry Frank

0

Thêm các dòng sau vào trước các dòng thông báo trực quan của bạn, để cung cấp cho kịch bản ý tưởng về việc màn hình X nào sẽ chạy notify-send(hoặc bất kỳ ứng dụng X nào khác):

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

Tất nhiên, bạn phải thay đổi dòng thứ hai theo môi trường máy tính để bàn (hoặc trình quản lý hiển thị). Dòng này hoạt động tốt cho Ubuntu 16.04 sử dụng sự thống nhất làm máy tính để bàn và lightdm làm trình quản lý hiển thị.

(từ bài này )

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.