Làm cách nào để chạy tập lệnh tùy chỉnh khi cắm thiết bị USB?


41

Phương pháp tiên tiến nhất để tự động thực thi các tập lệnh tùy chỉnh trên trình cắm thiết bị USB theo các bản phân phối Linux hiện tại như Debian / CentOS / Fedora là gì?

Ví dụ: nếu bạn muốn tự động gắn / sao chép một số tệp / vượt qua thiết bị lưu trữ dung lượng lớn USB dựa trên UUID của nó (hoặc ID thiết bị, v.v.).

Câu trả lời:


27

Đặt một dòng như thế này trong một tập tin trong /etc/udev/rules.d:

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

Thêm một mệnh đề như NAME="subdir/mydisk%n"nếu bạn muốn sử dụng một đường dẫn nhập tùy chỉnh bên dưới /dev.

Chạy udevadm info -a -n sdbđể xem những thuộc tính nào bạn có thể khớp với ( attribute=="value"; thay thế sdbbằng tên thiết bị được gán tự động cho đĩa, tương ứng với mục nhập mới được tạo /devkhi bạn cắm nó vào). Lưu ý rằng bạn có thể sử dụng ATTRSmệnh đề từ bất kỳ một khổ thơ nào: bạn có thể chọn bất kỳ khổ thơ nào, nhưng các ATTRSmệnh đề đều phải đến từ cùng một khổ thơ, bạn không thể trộn và kết hợp. Bạn có thể trộn ATTRScác mệnh đề với các loại mệnh đề khác được liệt kê trong một khổ thơ khác.


1
Câu trả lời này có còn hiệu lực không? Tôi không thể lấy tập lệnh để thực thi (và chạm vào một tập tin). Nếu bạn có thể cung cấp ví dụ cơ bản nhất thực thi tập lệnh khi mọi thứ được cắm vào, điều đó sẽ rất tuyệt và chúng ta có thể làm việc từ đó.
Redsandro

@Redsandro Tôi có các biến thể của quy tắc này trong cấu hình udev của mình và chúng đang hoạt động. Bạn đã cắm thiết bị ra và quay lại, hoặc chạy udevadm trigger? Hệ thống của bạn có sử dụng udev không? Nếu bạn muốn chạy tập lệnh khi có bất cứ thứ gì được cắm, hãy xóa tất cả các điều kiện (mệnh đề với ==) (có thể cú pháp yêu cầu một điều kiện, tôi không chắc chắn; nếu có, hãy sử dụng KERNEL=="*").
Gilles 'SO- ngừng trở nên xấu xa'

Tôi cũng đã thử điều đó, nhưng vì nó hiệu quả với bạn, tôi phải bỏ lỡ một bước. Tôi đã chuyển câu hỏi này ở đây , vì vậy tôi có thể viết mã ví dụ.
Redsandro

Có lẽ liên quan, tôi nghĩ rằng có một giới hạn thời gian về thời gian kịch bản có thể chạy. Tôi tin rằng nó rất ngắn (như 1 giây hoặc một cái gì đó). Nếu mất nhiều thời gian hơn thế, thì udev sẽ giết nó. Bạn có thể giải quyết vấn đề này bằng cách sử dụng nền tảng kịch bản với nội dung tương tự at. Xem "chạy chương trình bên ngoài" trên reactivated.net/writing_udev_rules.html
cheshirekow

Chỉ cần thêm vào đó, vì lợi ích của sự hoàn chỉnh, nhu cầu tập tin để có hậu tố .rulesvà các tập tin trong thư mục được đọc theo một thứ tự từ vựng (ước sử dụng tiền tố số để sắp xếp chúng), và họ có thể bên dưới /etc/, /usr/libhoặc /run. Để biết thêm, RTFM .
starfry

14

Tôi đã xem xét /lib/udev/rules.dcác ví dụ về các quy tắc liên quan đến đĩa. Trên hệ thống Ubuntu, một tệp quy tắc cung cấp biến môi trường ID_FS_UUID_ENCmà bạn có thể sử dụng trong các tệp quy tắc riêng.

Vì vậy, tôi đặt một tập tin quy tắc tùy chỉnh theo /etc/udev/rules.d/foodevice.rules. Vì nó không có tiền tố với một số, nên cuối cùng nó được chạy bởi udev. Btw, trình nền udev đã theo dõi /etc/udev/rules.dcác thay đổi mà bạn không cần phải khởi động lại khi thay đổi tệp.

Nội dung của /etc/udev/rules.d/foodevice.ruleslà:

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

(đây là một quy tắc - bạn phải xóa dòng mới sau mệnh đề ENV vì udev không có cơ chế tiếp tục dòng)

Một chương trình được bắt đầu bởi udev chặn daemon - do đó nó không nên chạy trong một thời gian dài. Tôi đã giải quyết nó thông qua at- tức là bằng cách tách ra khỏi quá trình thực hiện công việc thực tế:

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

1
Bạn có thể cần tải lại các quy tắc udev bằng cách sử dụng udevadm control --reload-rules, tùy thuộc vào phân phối của bạn.
user44038

1
Thay vì at nowtôi đề nghị batch.
Phục hồi Monica - M. Schröder

Làm gì khi bạn không có atcũng không batch? Tôi đang ở trong một môi trường nhúng với busybox .
natenho

@natenho, bạn có thể sử dụng ~/path/mountcopystuff.sh &- atv.v. có lợi thế là bạn nhận được thông báo qua email trong trường hợp có sự cố - nhưng trên hệ thống nhúng, điều này có lẽ không được quan tâm nhiều.
maxschlepzig
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.