Câu trả lời:
Có nhiều giải pháp đẹp hơn với systemd . Bạn tạo một dịch vụ phụ thuộc và được bạn muốn phương tiện truyền thông, ví dụ:/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
Sau đó, bạn phải bắt đầu / kích hoạt dịch vụ:
sudo systemctl start your.service
sudo systemctl enable your.service
Sau khi mount, systemd kích hoạt tập lệnh kích hoạt của bạn. Ưu điểm so với quy tắc udev là tập lệnh thực sự kích hoạt sau khi mount chứ không phải sau khi thêm thiết bị hệ thống.
Trường hợp sử dụng : Tôi có một phân vùng được mã hóa mà tôi muốn sao lưu tự động. Sau khi thêm thiết bị tôi phải nhập mật khẩu. Nếu tôi nối tập lệnh sao lưu vào udev, tập lệnh sẽ cố chạy vào thời điểm tôi đang nhập mật khẩu, sẽ thất bại.
Tài nguyên: Viết kịch bản với udev
Lưu ý: Bạn có thể tìm thấy đơn vị thiết bị của mình với:systemctl list-units -t mount
systemctl enable your.service
. Các tập tin kịch bản phải được thực thi.
Requires=
, After=
và WantedBy=
dòng cả với media-bb.mount
và media-BB.mount
vì Nautilus show cho tôi những khối lượng là "BB", không phải "bb". Thông báo lỗi tương tự, ngoại trừ viết hoa. Chuyện gì vậy? Tôi bằng cách nào đó phải tạo ra media-<something>.mount
dịch vụ đó ?
Bắt đầu bằng cách tìm thiết bị của bạn trong lsusb
. Lưu ý ID (ví dụ 0a81:0101
)
Tạo một tệp quy tắc udev mới /etc/udev/rules.d/
thông qua sudoedit /etc/udev/rules.d/100-mount-videos.rules
và thực hiện một quy tắc mới trong đó như sau:
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
Lưu ý cách tôi sử dụng ID từ lsusb
.
Sau đó, bạn chỉ cần viết kịch bản để thực hiện công việc. Một lệnh mount đơn giản sẽ hoạt động. Bạn có thể cần một sleep 5
lệnh trong đó để chờ hệ thống tập tin khởi tạo (nếu bạn rời khỏi gnome để thực hiện việc gắn kết chính - nhưng bạn có thể tự do gắn kết nó trước và sau đó bạn có thể không cần ngủ).
Bổ sung từ Allan: Các tập lệnh chạy dài có thể chặn "tất cả các sự kiện tiếp theo cho thiết bị này hoặc thiết bị phụ thuộc". Trang người đàn ông Mint của tôi nói thêm "Các nhiệm vụ chạy dài cần phải được tách ra ngay lập tức khỏi quá trình sự kiện." Không có mẹo nào được đưa ra về nơi để đạt được kỹ năng để làm điều này.
Trả lời từ Oli: Gói nó như vậy: https://askubfox.com/a/106359/449
/root/
hoặc ở nơi chỉ có root mới có thể chỉnh sửa tập lệnh.
Một cách khác để nhận các giá trị cho ATTRS {idVendor} và ATTRS {id SẢNt} (đã thử nghiệm trong Ubuntu 12.04) là:
Tìm nơi USB của bạn được gắn kết:
$ mount | grep /dev/sd*
Điều này cho thấy một cái gì đó như sau:
/dev/sdb on /media/SOMEDIR type vfat ...
Sử dụng udevadm để lấy thông tin thiết bị đó:
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
đầu ra phải giống như:
E: ID_MODEL_ID=001a
E: ID_VENDOR_ID=002b
Bây giờ sử dụng id mô hình cho ATTRS {id SẢNt} và id nhà cung cấp cho ATTRS {idVendor}
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
Trong Nautilus trong Chỉnh sửa> Tùy chọn> Phương tiện, bạn có thể chọn "hành động khác" và thay vì "lệnh costum". cho các loại phương tiện truyền thông khác nhau được thực hiện. Vào thời điểm đó, ổ đĩa USB đã được gắn, nhưng tôi cho rằng bạn vẫn có thể liên kết nó (với lệnh costum) với thư mục mà bạn muốn ổ đĩa xuất hiện. Tôi không thể biết điều này dễ hơn hay tốt hơn sử dụng udev.
Nếu bạn không muốn can thiệp vào bộ điều khiển filemanager của bạn (nautilus, konquerer, gnome, v.v.) về việc gắn và ngắt kết nối thiết bị của bạn, tôi khuyên bạn không nên đi theo con đường udev.
Thay vào đó, hãy sử dụng keo dán udisks nếu hệ thống của bạn sử dụng udisks (hầu như tất cả đều được).
Sau khi cài đặt, chỉ cần tạo một tập tin cấu hình ~/.udisks-glue.conf
trong thư mục chính của bạn như thế này.
Ví dụ sau đây của tôi cập nhật dữ liệu Hỗ trợ GPS trên máy ảnh của tôi mỗi khi tôi cắm thẻ 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"
}
Sau đó, chỉ cần đảm bảo udisks-keo bắt đầu khi bạn khởi động hoặc đăng nhập. Tức là thông qua các ứng dụng khởi động của gnome
Câu trả lời của @ sumid có vấn đề. Bạn không nên bắt đầu dịch vụ. Bạn chỉ cần kích hoạt nó.
tập tin: /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
Sau đó kích hoạt dịch vụ:
sudo systemctl enable your.service
Đó là tất cả.
Lưu ý: Bạn có thể tìm thấy nhãn trung gian của mình với:sudo systemctl list-units -t mount
Lưu ý2: Nếu dịch vụ bị lỗi bằng cách nào đó (ví dụ: tập lệnh không thể thực thi được), điểm gắn kết của bạn sẽ thay đổi sang <old_mount_point_name>1
lần tiếp theo bạn gắn thiết bị usb. Để khắc phục sự cố này, bạn chỉ cần thực thisudo systemctl reset-failed