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.).
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.
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.
(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
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.
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, gunakanKERNEL=="*"
).at
. Lihat "menjalankan program eksternal" di reactivated.net/writing_udev_rules.html.rules
dan file dalam direktori dibaca dalam urutan leksikal (konvensi menggunakan awalan numerik untuk memesannya), dan mereka dapat berada di bawah/etc/
,/usr/lib
atau/run
. Untuk lebih lanjut, RTFM .Saya mencari
/lib/udev/rules.d
contoh aturan terkait disk. Pada Ubuntu sistem satu file aturan memberikan variabel lingkunganID_FS_UUID_ENC
yang 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.d
perubahan sehingga Anda tidak perlu memulai ulang pada perubahan file.Isi dari
/etc/udev/rules.d/foodevice.rules
adalah:(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:sumber
udevadm control --reload-rules
, tergantung pada distribusi Anda.at now
saya sarankanbatch
.at
atau tidakbatch
? Saya berada di lingkungan tertanam dengan busybox .~/path/mountcopystuff.sh &
-at
dll. memiliki keuntungan bahwa Anda mendapatkan notifikasi email jika terjadi kesalahan - tetapi pada sistem embedded ini mungkin tidak terlalu menarik.