Saya ingin menjalankan skrip ketika saya mencolokkan perangkat di mesin Linux saya. Misalnya, jalankan xinput
di mouse atau skrip cadangan pada drive tertentu.
Saya telah melihat banyak artikel tentang ini, paling baru di sini dan di sini . Tapi saya tidak bisa membuatnya bekerja.
Berikut adalah beberapa contoh sederhana yang mencoba untuk mendapatkan setidaknya semacam respons.
/etc/udev/rules.d/test.rules
#KERNEL=="sd*", ATTRS{vendor}=="*", ATTRS{model}=="*", ATTRS{serial}=="*", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=="add", "SUBSYSTEM=="usb", ATTRS{model}=="My Book 1140 ", ATTRS{serial}=="0841752394756103457194857249", RUN+="/usr/local/bin/test.sh"
#ACTION=="add", "SUBSYSTEM=="usb", RUN+="/usr/local/bin/test.sh"
#KERNEL=="sd*", ACTION=={add}, RUN+="/usr/local/bin/test.sh"
KERNEL=="sd*", RUN+="/usr/local/bin/test.sh"
KERNEL=="*", RUN+="/usr/local/bin/test.sh"
/usr/local/bin/test.sh
#!/usr/bin/env bash
echo touched >> /var/log/test.log
if [ "${ACTION}" = "add" ] && [ -f "${DEVICE}" ]
then
echo ${DEVICE} >> /var/log/test.log
fi
Folder aturan diawasi oleh inotify
dan harus segera aktif. Saya terus memasang kembali keyboard, mouse, tablet, memorystick, dan usb-drive, tetapi tidak ada apa-apa. Tidak ada file log yang disentuh.
Sekarang, apa cara paling sederhana untuk setidaknya tahu ada sesuatu yang berhasil? Lebih mudah bekerja dari sesuatu yang berfungsi daripada dari sesuatu yang tidak.
udevadm trigger
atau menyambungkan perangkat untuk menerapkan aturan baru?3.5.0-23-generic
.Jawaban:
Jika Anda ingin menjalankan skrip pada perangkat tertentu, Anda dapat menggunakan vendor dan id produk
Di
/etc/udev/rules.d/test.rules
:di
test.sh
:Dengan
env
, Anda dapat melihat lingkungan apa yang ditetapkan dari udev dan denganfile
, Anda akan menemukan jenis file.Atribut konkret untuk perangkat Anda dapat ditemukan bersama
lsusb
memberi
sumber
ACTION=="add",
langsung ke definisi aturan.Ini bukan langsung tentang pertanyaan Anda tetapi tentang apa yang Anda lakukan. Jika Anda memulai skrip cadangan dari udev, Anda akan menghadapi dua masalah utama:
Saran saya adalah membuat skrip di rumah pengguna Anda yang mendengarkan pipa bernama dan itu akan dimulai secara tidak sinkron seperti:
Catatan: Saya menggunakan auto-mount dengan kde jadi saya memeriksa folder yang akan muncul. Anda dapat melewatkan parameter / dev / sd * di fifo dari aturan udev dan memasangnya sendiri di skrip. Untuk menulis di fifo jangan lupa bahwa udev bukan shell dan pengalihan tidak berfungsi. RUN Anda harus seperti:
RUN + = "/ bin / sh -c '/ bin / echo terhubung >> / tmp / IomegaUsbPipe'"
sumber
Saya telah memposting solusi di /ubuntu//a/516336 dan saya juga menyalin-menempelkan solusi di sini.
Saya menulis skrip Python menggunakan pyudev yang saya biarkan berjalan di latar belakang. Script itu mendengarkan acara udev (dengan demikian, ini sangat efisien) dan menjalankan kode apa pun yang saya inginkan. Dalam kasus saya, ini menjalankan
xinput
perintah untuk mengatur perangkat saya ( tautan ke versi terbaru ).Ini versi singkat dari skrip yang sama:
sumber
call()
. Dengan begitu, jika perlu memberikan argumen padafoobar.sh
skrip, Anda dapat melakukannya secara dinamis.Untuk menjalankan skrip pada saat boot ketika perangkat usb dimasukkan, saya menggunakan solusi di bawah ini:
Format flashdisk atau penyimpanan usb lainnya dan berikan nama saat melakukannya. Kemudian
/etc/rc.local
tambahkan barisls -q /dev/disk/by-label > /home/pi/label.txt
itu akan membuat file txt bernama label.txt (bisa berupa nama lain)
sekali lagi di /etc/rc.local tambahkan 2 baris lagi:
Sekarang setiap flashdisk dengan nama USB_drive_name dimasukkan, itu akan menjalankan skrip.
Dengan sedikit modifikasi, solusi di atas dapat digunakan ketika sistem aktif dan berjalan.
sumber
udev
untuk waktu lain bukanlah "sedikit modifikasi") dan Raspberry Pi. Ada yang tidak perlusudo
-rc.local
berjalan sebagai root, itu adalah masalah eskalasi hak istimewa - file yang dapat diedit oleh pengguna normal dijalankan sebagai root.