udev 규칙에서 보내는 호출 알림

udev 규칙에서 보내는 호출 알림

저는 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"

두 가지 스크립트가 더 있습니다:

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. 어쩌면 장치 플러그/플러그 해제 알림에 대한 더 나은 솔루션이 있을까요? 아시는 분 추천 부탁드립니다.

답변1

글쎄, 몇 시간 동안 인터넷 검색을 하고 포럼에 질문한 후에 제대로 작동하는 것 같습니다. 특정 USB 장치가 연결/분리될 때 좋은 시각적 및/또는 오디오 알림을 받고 싶은 사람은 누구나 내 스크립트를 설치할 수 있습니다. 아래 설치 세부 정보를 참조하세요.

먼저 내 질문에 답해 보겠습니다.

lsusb1. 출력에서 ​​볼 수 있는 것과 동일한 연결된 장치의 실제 헤더를 얻으려면 어떻게 해야 합니까?

커널에는 (보통) 그러한 헤더가 없습니다. 여러 쌍의 헤더를 포함하는 데이터베이스 파일이 있으며 일반적으로 파일 vendor_id:product_id입니다 . /usr/share/hwdata/usb.ids데이터베이스는 를 통해 업데이트할 수 있습니다 /usr/sbin/update-usbids.sh. 감사합니다linux.org.ru이 정보를 위해.

장치 제목을 쌍으로 가져오는 특별한 도구가 있는지 모르기 때문에 and를 사용하여 몇 가지 수정을 vendor_id:product_id해야 했습니다 . 예를 들면 다음과 같습니다.lsusbgreplsusb | grep '0458:003a'

2. 현재 활성화된 알림이 너무 많습니다. 예를 들어, USB 스틱을 연결했을 때 약 15개의 알림을 받았습니다!

이에 대한 규칙을 작성하는 방법을 찾지 못했다는 점을 인정해야 합니다. 그러나 이를 필터링하는 다른 방법을 찾았습니다.

udev몇 가지 대체 항목을 사용할 수 있습니다. 예를 들어 및 각각을 통해 RUN+="..."버스 번호와 장치 번호를 얻을 수 있습니다. 먼저 내 스크립트에서는 연결된 장치 목록을 특수 파일에 저장합니다. 그러면 스크립트가 새로운 "삽입" 이벤트를 받고 장치의 버스 번호와 장치 번호가 이미 파일에 저장되어 있으면 알림을 생성합니다. 둘째, 이러한 교체는 일반적으로 "일련의" 이벤트에서 하나의 장치에만 적용됩니다. 그러나 어쨌든 설명된 알고리즘은 어쨌든 그것을 해결해야 합니다.$attr{busnum}$attr{devnum}$attr{busnum}$attr{devnum}


현재 프로젝트 페이지:내 udev 알림.

다음과 같습니다.

여기에 이미지 설명을 입력하세요.

설치 세부정보.

Linux Mint 13에서 테스트한 결과, Ubuntu 및 기타 Ubuntu 파생 제품에서 작동할 것이라고 생각하며 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를 확인하세요.

답변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

물론, 데스크탑 환경(또는 디스플레이 관리자)에 따라 두 번째 줄을 변경해야 합니다. 이 줄은 Unity를 데스크탑으로 사용하는 Ubuntu 16.04용입니다.광DM디스플레이 관리자로서.

(에서이 게시물)

관련 정보