วิธีการเรียกใช้สคริปต์ที่กำหนดเองบนปลั๊กอินอุปกรณ์ USB?


41

อะไรคือวิธีการที่ทันสมัยสำหรับการเรียกใช้สคริปต์ที่กำหนดเองโดยอัตโนมัติเมื่อปลั๊กอินอุปกรณ์ USB ภายใต้ดิสทริบิวชัน Linux ปัจจุบันเช่น Debian / CentOS / Fedora

ตัวอย่างเช่นหากคุณต้องการเมานต์ / คัดลอกไฟล์บางไฟล์โดยอัตโนมัติ / ติดตั้งอุปกรณ์เก็บข้อมูลขนาดใหญ่แบบ USB ตาม UUID (หรือ ID อุปกรณ์ ฯลฯ )

คำตอบ:


27

ใส่บรรทัดแบบนี้ลงในไฟล์ใน/etc/udev/rules.d:

KERNEL=="sd*", ATTRS{vendor}=="Yoyodyne", ATTRS{model}=="XYZ42", ATTRS{serial}=="123465789", RUN+="/pathto/script"

เพิ่มข้อเช่นถ้าคุณต้องการที่จะใช้เส้นทางเข้าที่กำหนดเองภายใต้NAME="subdir/mydisk%n"/dev

เรียกใช้udevadm info -a -n sdbเพื่อดูแอตทริบิวต์ที่คุณสามารถเปรียบเทียบได้ ( attribute=="value"; แทนที่sdbด้วยชื่ออุปกรณ์ที่กำหนดให้กับดิสก์โดยอัตโนมัติซึ่งสอดคล้องกับรายการใหม่ที่สร้างขึ้น/devเมื่อคุณเสียบเข้ากับ) โปรดทราบว่าคุณสามารถใช้ATTRSคำสั่งใด ๆ จากหนึ่งบท: คุณสามารถเลือกฉันท์ใด ๆ แต่ATTRSคำสั่งทั้งหมดจะต้องมาจากบทเดียวกันคุณไม่สามารถผสมและตรงกับ คุณสามารถผสมATTRSclauses กับ clauses ประเภทอื่น ๆ ที่อยู่ในรายการ stanza อื่น


1
คำตอบนี้ยังคงใช้ได้หรือไม่? ฉันจะทำให้สคริปต์เรียกใช้งาน (และแตะไฟล์) ได้ไม่ จำกัด จำนวน หากคุณสามารถให้ตัวอย่างพื้นฐานที่สุดที่เรียกใช้งานสคริปต์เมื่อมีการเสียบปลั๊กสิ่งใดสิ่งหนึ่งจะดีมากและเราสามารถทำงานได้จากที่นั่น
Redsandro

@Redsandro ฉันมีรูปแบบของกฎนี้ในการกำหนดค่า evev ของฉันและพวกเขากำลังทำงาน คุณเสียบอุปกรณ์กลับเข้ามาหรือย้อนกลับหรือรันudevadm trigger? ระบบของคุณใช้ udev หรือไม่ หากคุณต้องการเรียกใช้สคริปต์เมื่อมีการเสียบปลั๊กใด ๆ ให้ลบเงื่อนไขทั้งหมด (ส่วนคำสั่งด้วย==) (บางทีไวยากรณ์ต้องใช้เงื่อนไขเดียวฉันไม่แน่ใจถ้าใช้ให้ใช้KERNEL=="*")
Gilles 'ดังนั้นหยุดความชั่วร้าย'

ฉันก็ลองเช่นกัน แต่เนื่องจากมันเหมาะกับคุณฉันจะต้องพลาดสักก้าว ฉันย้ายคำถามนี้ไปแล้วดังนั้นฉันจึงสามารถเขียนโค้ดตัวอย่าง
Redsandro

อาจเกี่ยวข้องกันฉันคิดว่ามีการ จำกัด เวลาว่าสคริปต์จะทำงานได้นานเท่าใด ฉันเชื่อว่ามันสั้นมาก (เช่น 1 วินาทีหรือบางอย่าง) หากใช้เวลานานกว่านั้น udev จะฆ่ามัน คุณสามารถทำงานรอบนี้โดยใช้ backgrounding atสคริปต์กับสิ่งที่ต้องการ ดู "การเรียกใช้โปรแกรมภายนอก" ในreactivated.net/writing_udev_rules.html
cheshirekow

เพียงเพื่อเพิ่มนี้เพื่อความครบถ้วนสมบูรณ์ความต้องการไฟล์ที่จะมีคำต่อท้าย.rulesและไฟล์ในไดเรกทอรีที่มีการอ่านคำสั่งคำศัพท์ (การประชุมใช้คำนำหน้าเป็นตัวเลขคำสั่งพวกเขา) และพวกเขาสามารถอยู่ใต้/etc/, หรือ/usr/lib /runสำหรับRTFMเพิ่มเติม
starfry

14

ฉันค้นหา/lib/udev/rules.dตัวอย่างของกฎที่เกี่ยวข้องกับดิสก์ ในระบบอูบุนตูหนึ่งไฟล์กฎให้ตัวแปรสภาพแวดล้อมID_FS_UUID_ENCที่คุณสามารถใช้ในไฟล์กฎของตัวเอง

/etc/udev/rules.d/foodevice.rulesดังนั้นฉันใส่แฟ้มกฎที่กำหนดเองภายใต้ เนื่องจากมันไม่ได้ขึ้นต้นด้วยตัวเลขมันจะถูกรันที่ udev ในที่สุด Btw, udev daemon คอยเฝ้าดู/etc/udev/rules.dการเปลี่ยนแปลงซึ่งคุณไม่จำเป็นต้องรีสตาร์ทมันเมื่อมีการเปลี่ยนแปลงไฟล์

เนื้อหาของ/etc/udev/rules.d/foodevice.rulesคือ:

ACTION=="add", KERNEL=="sd*[!0-9]", ENV{ID_FS_UUID_ENC}=="FFFF-AAAF",
  RUN+="/usr/bin/sudo -u juser /home/juser/path/script.sh"

(นี่เป็นกฎเดียว - คุณต้องลบ newline หลังจากส่วนคำสั่ง ENV เนื่องจาก udev ไม่มีกลไกต่อเนื่องของบรรทัด)

โปรแกรมเริ่มต้นโดย udev บล็อก daemon - ดังนั้นจึงไม่ควรรันเป็นเวลานาน ฉันแก้ไขมันผ่านat- เช่นผ่านการแยกออกจากกระบวนการที่ทำงานจริง:

$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now

1
คุณอาจจำเป็นต้องรีโหลดกฎ udev โดยใช้udevadm control --reload-rulesทั้งนี้ขึ้นอยู่กับการกระจายของคุณ
user44038

1
แทนที่จะผมขอแนะนำให้at now batch
Reinstate Monica - M. Schröder

จะทำอย่างไรเมื่อคุณมีค่าatหรือbatch? ผมอยู่ในสภาพแวดล้อมที่ฝังตัวอยู่กับbusybox
natenho

@natenho คุณสามารถใช้~/path/mountcopystuff.sh &- atฯลฯ มีข้อได้เปรียบที่คุณจะได้รับการแจ้งเตือนทางอีเมลในกรณีที่มีสิ่งผิดปกติ - แต่ในระบบฝังตัวซึ่งอาจไม่น่าสนใจมากนัก
maxschlepzig
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.