Bagaimana menjalankan skrip khusus pada plug-in perangkat USB?


41

Apa metode tercanggih untuk secara otomatis mengeksekusi skrip khusus pada plug-in perangkat USB di bawah distribusi Linux saat ini seperti Debian / CentOS / Fedora?

Misalnya jika Anda ingin secara otomatis me-mount / menyalin beberapa file / umount perangkat penyimpanan massal USB berdasarkan UUID-nya (atau ID perangkat dll.).

Jawaban:


27

Masukkan baris seperti ini di file di /etc/udev/rules.d:

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

Tambahkan klausa seperti NAME="subdir/mydisk%n"jika Anda ingin menggunakan jalur entri khusus di bawah /dev.

Jalankan udevadm info -a -n sdbuntuk melihat atribut apa yang dapat Anda cocokkan ( attribute=="value"; ganti sdbdengan nama perangkat yang ditetapkan secara otomatis ke disk, sesuai dengan entri baru yang dibuat /devsaat Anda memasangnya). Perhatikan bahwa Anda dapat menggunakan ATTRSklausa dari satu bait: Anda dapat memilih bait, tetapi semua ATTRSklausa harus berasal dari bait yang sama, Anda tidak dapat mencampur dan mencocokkan. Anda dapat mencampur ATTRSklausa dengan klausa jenis lain yang tercantum dalam bait berbeda.


1
Apakah jawaban ini masih valid? Di bawah jumlah yang tidak bisa saya dapat skrip untuk mengeksekusi (dan menyentuh file). Jika Anda dapat memberikan contoh paling dasar yang mengeksekusi skrip ketika ada sesuatu yang terpasang, itu akan menjadi hebat dan kami dapat bekerja dari sana.
Redsandro

@Redsandro Saya memiliki variasi aturan ini dalam konfigurasi udev saya dan mereka berfungsi. Apakah Anda mencolokkan perangkat dan kembali, atau berjalan udevadm trigger? Apakah sistem Anda menggunakan udev? Jika Anda ingin menjalankan skrip ketika ada sesuatu yang dicolokkan, hapus semua kondisi (klausa dengan ==) (mungkin sintaksinya memerlukan satu syarat, saya tidak yakin; jika ya, gunakan KERNEL=="*").
Gilles 'SO- stop being evil'

Saya sudah mencobanya juga, tetapi karena itu bekerja untuk Anda, saya pasti kehilangan satu langkah. Saya telah memindahkan pertanyaan ini di sini , sehingga saya dapat menulis kode contoh.
Redsandro

Mungkin terkait, saya pikir ada batas waktu berapa lama skrip berjalan. Saya percaya ini sangat singkat (seperti 1 detik atau lebih). Jika butuh lebih lama dari itu, maka udev akan membunuhnya. Anda dapat mengatasi ini dengan menggunakan latar belakang skrip dengan sesuatu seperti at. Lihat "menjalankan program eksternal" di reactivated.net/writing_udev_rules.html
cheshirekow

Hanya untuk menambah ini, demi kelengkapan, file perlu memiliki akhiran .rulesdan file dalam direktori dibaca dalam urutan leksikal (konvensi menggunakan awalan numerik untuk memesannya), dan mereka dapat berada di bawah /etc/, /usr/libatau /run. Untuk lebih lanjut, RTFM .
starfry

14

Saya mencari /lib/udev/rules.dcontoh aturan terkait disk. Pada Ubuntu sistem satu file aturan memberikan variabel lingkungan ID_FS_UUID_ENCyang dapat Anda gunakan dalam file aturan sendiri.

Jadi saya meletakkan file aturan khusus di bawah /etc/udev/rules.d/foodevice.rules. Karena tidak diawali dengan angka, akhirnya dijalankan oleh udev. Btw, daud udev mengawasi /etc/udev/rules.dperubahan sehingga Anda tidak perlu memulai ulang pada perubahan file.

Isi dari /etc/udev/rules.d/foodevice.rulesadalah:

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

(ini adalah satu aturan - Anda harus menghapus baris baru setelah klausa ENV karena udev tidak memiliki mekanisme kelanjutan garis)

Sebuah program yang dimulai oleh udev memblokir daemon - sehingga tidak akan berjalan untuk waktu yang lama. Saya menyelesaikannya melalui at- yaitu melalui melepaskan dari proses melakukan pekerjaan nyata:

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

1
Anda mungkin perlu memuat ulang aturan udev menggunakan udevadm control --reload-rules, tergantung pada distribusi Anda.
user44038

1
Alih-alih at nowsaya sarankan batch.
Reinstate Monica - M. Schröder

Apa yang harus dilakukan ketika Anda tidak memiliki atatau tidak batch? Saya berada di lingkungan tertanam dengan busybox .
natenho

@natenho, Anda dapat menggunakan ~/path/mountcopystuff.sh &- atdll. memiliki keuntungan bahwa Anda mendapatkan notifikasi email jika terjadi kesalahan - tetapi pada sistem embedded ini mungkin tidak terlalu menarik.
maxschlepzig
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.