มีวิธีเรียกใช้สคริปต์เมื่อติดตั้งอุปกรณ์ USB เฉพาะหรือไม่
ฉันเก็บวิดีโอของฉันไว้ใน USB แยกต่างหากและต้องการเรียกใช้สคริปต์ที่จะติดตั้งโฟลเดอร์วิดีโอบนอุปกรณ์ USB เข้ากับวิดีโอในโฟลเดอร์โฮม
มีวิธีเรียกใช้สคริปต์เมื่อติดตั้งอุปกรณ์ USB เฉพาะหรือไม่
ฉันเก็บวิดีโอของฉันไว้ใน USB แยกต่างหากและต้องการเรียกใช้สคริปต์ที่จะติดตั้งโฟลเดอร์วิดีโอบนอุปกรณ์ USB เข้ากับวิดีโอในโฟลเดอร์โฮม
คำตอบ:
มีวิธีการแก้ปัญหาที่ดีกว่าด้วยsystemdตอนนี้ คุณสร้างบริการที่ขึ้นอยู่กับสื่อที่คุณต้องการเช่น:/etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/home/you/bin/triggerScript.sh
[Install]
WantedBy=media-YourMediaLabel.mount
จากนั้นคุณต้องเริ่ม / เปิดใช้บริการ:
sudo systemctl start your.service
sudo systemctl enable your.service
หลังจากเมานต์ systemd จะยิงสคริปต์ทริกเกอร์ของคุณ ข้อได้เปรียบเหนือกฎ udev ก็คือสคริปต์จะทำงานจริงหลังจากการเมานท์ไม่ใช่หลังจากเพิ่มอุปกรณ์ระบบ
ใช้กรณี : ฉันมีพาร์ทิชันที่เข้ารหัสลับซึ่งฉันต้องการสำรองข้อมูลโดยอัตโนมัติ หลังจากเพิ่มอุปกรณ์ฉันต้องพิมพ์รหัสผ่าน หากฉันเชื่อมต่อสคริปต์สำรองไว้กับ udev สคริปต์จะพยายามเรียกใช้งานในเวลาที่ฉันพิมพ์รหัสผ่านซึ่งจะล้มเหลว
ทรัพยากร: การเขียนสคริปต์ด้วย udev
หมายเหตุ:คุณสามารถค้นหาหน่วยอุปกรณ์ของคุณด้วย:systemctl list-units -t mount
systemctl enable your.service
อย่าลืมที่จะเปิดใช้บริการของคุณ ไฟล์สคริปต์ต้องสามารถเรียกใช้งานได้
Requires=
, After=
และWantedBy=
สายทั้งที่มีmedia-bb.mount
และmedia-BB.mount
เพราะแสดงให้เห็นว่าฉัน Nautilus ปริมาณเป็น "บีบี" ไม่ "บีบี" ข้อความแสดงข้อผิดพลาดเดียวกันยกเว้นการใช้อักษรตัวพิมพ์ใหญ่ เกิดอะไรขึ้น ฉันต้องสร้างmedia-<something>.mount
บริการนั้นหรือไม่?
lsusb
เริ่มต้นด้วยการหาอุปกรณ์ของคุณ จดบันทึก ID (เช่น0a81:0101
)
สร้างไฟล์กฎ udev ใหม่/etc/udev/rules.d/
ผ่านทางsudoedit /etc/udev/rules.d/100-mount-videos.rules
และสร้างกฎใหม่ที่นั่น:
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
สังเกตว่าฉันใช้ ID จากlsusb
อย่างไร
จากนั้นคุณเพียงแค่ต้องเขียนสคริปต์เพื่อทำงาน คำสั่ง mount แบบง่ายควรใช้งานได้ คุณอาจจำเป็นต้องมีsleep 5
คำสั่งเพื่อรอให้ระบบไฟล์เริ่มต้น (ถ้าคุณปล่อยให้ gnome ทำการติดตั้งหลัก - แต่คุณมีอิสระที่จะติดมันก่อนแล้วคุณอาจไม่จำเป็นต้องหลับ)
เพิ่มเติมจาก Allan:สคริปต์ที่รันมายาวนานอาจบล็อก "เหตุการณ์เพิ่มเติมทั้งหมดสำหรับอุปกรณ์นี้หรืออุปกรณ์ที่ต้องใช้" หน้าคนมิ้นท์ของฉันกล่าวต่อไปว่า ไม่มีการให้ทิปในตำแหน่งที่จะได้รับทักษะในการทำเช่นนี้
ตอบกลับจาก Oli:ห่อเหมือน: https://askubuntu.com/a/106359/449
/root/
ใดที่ที่ root เท่านั้นที่สามารถแก้ไขได้
อีกวิธีหนึ่งในการรับค่าสำหรับ ATTRS {idVendor} และ ATTRS {idProduct} (ทดสอบใน Ubuntu 12.04) คือ:
ค้นหาตำแหน่งที่ติดตั้ง usb ของคุณ:
$ mount | grep /dev/sd*
สิ่งนี้แสดงสิ่งต่อไปนี้:
/dev/sdb on /media/SOMEDIR type vfat ...
ใช้ udevadm เพื่อรับข้อมูลอุปกรณ์ดังกล่าว:
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
ผลลัพธ์ควรเป็นดังนี้:
E: ID_MODEL_ID=001a
E: ID_VENDOR_ID=002b
ตอนนี้ใช้รหัสรุ่นสำหรับ ATTRS {idProduct} และรหัสผู้ขายสำหรับ ATTRS {idVendor}
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
ใน Nautilus ภายใต้แก้ไข> การตั้งค่า> สื่อคุณสามารถเลือก "การกระทำอื่น ๆ " และ "คำสั่ง costum" สำหรับสื่อประเภทต่างๆที่จะดำเนินการ เมื่อถึงเวลานั้นไดรฟ์ usb ติดตั้งอยู่แล้ว แต่ฉันคิดว่าคุณยังคงสามารถเชื่อมโยง (ด้วยคำสั่ง costum) ไปยังโฟลเดอร์ที่คุณต้องการให้ไดรฟ์ปรากฏขึ้นมาฉันไม่สามารถบอกได้ว่ามันง่ายกว่าหรือดีกว่าการใช้ udev
หากคุณไม่ต้องการยุ่งเกี่ยวกับเครื่องมือจัดการไฟล์ (nautilus, konquerer, gnome, etc) ของการควบคุมการติดตั้งและยกเลิกการต่อเชื่อมอุปกรณ์ของคุณฉันขอแนะนำว่าอย่าไปเส้นทาง udev
ให้ใช้udisks-adhesiveแทนหากระบบของคุณใช้ udisks (เกือบทั้งหมดทำได้)
หลังจากติดตั้งเพียงแค่สร้างไฟล์กำหนดค่า~/.udisks-glue.conf
ในไดเรกทอรีบ้านของคุณเช่นนี้
ตัวอย่างต่อไปนี้อัปเดตข้อมูล GPS-Assist ในกล้องของฉันทุกครั้งที่ฉันเสียบการ์ด SD
filter BT16EXTREME {
optical = false
partition_table = false
usage = filesystem
label = BT16EXTREME
}
match BT16EXTREME {
post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}
หลังจากนั้นตรวจสอบให้แน่ใจว่า udisks-glue เริ่มต้นเมื่อคุณบูตหรือลงชื่อเข้าใช้ คือผ่านแอปพลิเคชันเริ่มต้นของ gnome
@ คำตอบของ sumid มีปัญหา คุณไม่ควรเริ่มบริการ คุณเพียงแค่ต้องเปิดใช้งาน
ไฟล์: /etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh
[Install]
WantedBy=media-YourMediaLabel.mount
จากนั้นเปิดใช้งานบริการ:
sudo systemctl enable your.service
นั่นคือทั้งหมดที่
หมายเหตุ:คุณสามารถค้นหาป้ายกำกับของคุณได้ที่:sudo systemctl list-units -t mount
Note2:หากบริการไม่สำเร็จ (ตัวอย่างเช่นสคริปต์ไม่สามารถใช้งานได้) จุดเชื่อมต่อของคุณจะเปลี่ยนเป็น<old_mount_point_name>1
ครั้งต่อไปที่คุณเมานท์อุปกรณ์ usb ในการแก้ไขปัญหานี้คุณเพียงแค่ต้องดำเนินการsudo systemctl reset-failed