โทรแจ้ง - ส่งจากกฎ udev


13

ฉันใช้ Linux Mint 13 MATE และฉันพยายามตั้งค่าการแจ้งเตือนเมื่อฉันเสียบ / ถอดปลั๊กอุปกรณ์

ก่อนอื่นฉันพบแพ็คเกจudev-alertแต่น่าเสียดายที่มันใช้งานไม่ได้สำหรับฉัน: มันใช้งานได้ในเวลาน้อยมาก (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

หลังจาก googling หลายชั่วโมงและถามในกระดานสนทนาฉันได้รับมัน (ดูเหมือน) ใครก็ตามที่ต้องการได้รับการแจ้งเตือนด้วยภาพและ / หรือเสียงที่ดีเมื่อมีการเสียบอุปกรณ์ USB บางตัว / ถอดปลั๊กสามารถติดตั้งสคริปต์ของฉันดูรายละเอียดการติดตั้งด้านล่าง

ก่อนอื่นตอบคำถามของฉันเอง

1. วิธีการได้รับชื่อจริงของอุปกรณ์ที่เชื่อมต่อเช่นเดียวกับที่ฉันเห็นในการlsusbส่งออก?

ไม่มีชื่อเรื่องดังกล่าวในเคอร์เนล (ในกรณีทั่วไป) มีไฟล์ฐานข้อมูลที่มีชื่อหลายคู่vendor_id:product_idโดยปกติจะเป็น/usr/share/hwdata/usb.idsไฟล์ /usr/sbin/update-usbids.shฐานข้อมูลนี้สามารถปรับปรุงโดย ขอบคุณ guys จากlinux.org.ruสำหรับข้อมูลนั้น

ฉันไม่รู้ว่ามีเครื่องมือพิเศษสำหรับรับชื่ออุปกรณ์โดยการจับคู่vendor_id:product_idหรือไม่ดังนั้นฉันต้องแฮ็คบิตด้วยlsusbและgrep: ตัวอย่างเช่นlsusb | grep '0458:003a'

2. ปัจจุบันมีการเปิดใช้งานการแจ้งเตือนมากเกินไป บอกว่าเมื่อฉันต่ออุปกรณ์ USB ของฉันฉันได้รับการแจ้งเตือนประมาณ 15 ครั้ง!

ฉันต้องยอมรับว่าฉันไม่ได้หาวิธีเขียนกฎนี้ แต่ฉันพบวิธีอื่นที่ฉันสามารถกรองได้

udevช่วยให้เราสามารถใช้แทนบางอย่างสำหรับRUN+="...": พูดเราสามารถได้รับหมายเลขรถประจำทางและจำนวนอุปกรณ์โดย$attr{busnum}และ$attr{devnum}ตามลำดับ ประการแรกในสคริปต์ของฉันฉันจัดเก็บรายการอุปกรณ์ที่เชื่อมต่อไว้ในไฟล์พิเศษดังนั้นหากสคริปต์มีเหตุการณ์ "ปลั๊ก" ใหม่และ busnum และ devnum ของอุปกรณ์นี้ถูกเก็บไว้ในไฟล์ของเราแล้วการแจ้งเตือนจะไม่ถูกสร้างขึ้น และประการที่สองการทดแทนเหล่านี้$attr{busnum}และ$attr{devnum}มักจะใช้ได้เฉพาะกับหนึ่งในอุปกรณ์จาก "ซีรีส์" ของเหตุการณ์ แต่อย่างไรก็ตามอัลกอริทึมที่อธิบายควรจัดเรียงในกรณีใด ๆ


หน้าโครงการปัจจุบัน: My-udev-แจ้ง

ดูเหมือนว่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

รายละเอียดการติดตั้ง

การทดสอบบนลินุกซ์มิ้นท์ 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 ในที่เก็บสำหรับรายละเอียด


บางทีคุณควรดูคำถาม / คำตอบนี้: stackoverflow.com/questions/469243/ ......มันใช้pyudevเพื่อรับการแจ้งเตือนและไม่ต้องใช้สคริปต์/etc/udevเพิ่มเติม
เดนิลสันซามาเอีย

การแจ้งเตือนแบบปลั๊ก / ถอดปลั๊กอุปกรณ์ถูกซ่อน / ไม่สามารถใช้งานได้ตามค่าเริ่มต้นหรือไม่
gonzobrains

1
@gonzobrains ไม่ทันทีที่คุณเพิ่มกฎที่ถูกต้องลงใน /etc/udeve/rules.d มันควรจะทำงานกับอุปกรณ์ที่เชื่อมต่อใหม่
Dmitry Frank

@DmitryFrank สิ่งที่ฉันหมายถึงคือการแจ้งเตือนเหล่านี้แสดงโดยอัตโนมัติตามค่าเริ่มต้นหรือคุณต้องทำตามขั้นตอนด้านบนเพื่อแสดง สำหรับโครงการของฉันฉันต้องการที่จะระงับพวกเขา (เช่นไม่มีการแจ้งเตือนตามค่าเริ่มต้น)
gonzobrains

1
@gonzobrains หากคุณยังไม่ได้ทำตามขั้นตอนด้านบนและคุณได้รับการแจ้งเตือนเมื่อคุณเสียบ / ถอดปลั๊กอุปกรณ์ใด ๆ สคริปต์ของฉันก็ไม่มีส่วนเกี่ยวข้อง โปรแกรมอื่นทำสิ่งนี้ให้คุณ
Dmitry Frank

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 คือ ID กลุ่มของผู้ใช้

ตัวอย่าง bigbird และ 1,000

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.