Jika Anda ingin menjalankan skrip pada perangkat tertentu, Anda dapat menggunakan id vendor dan produk
-
Di
/etc/udev/rules.d/test.rules
:ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
-
di
test.sh
:#! /bin/sh env >>/tmp/test.log file "/sys${DEVPATH}" >>/tmp/test.log if [ "${ACTION}" = add -a -d "/sys${DEVPATH}" ]; then echo "add ${DEVPATH}" >>/tmp/test.log fi
Dengan env
, Anda dapat melihat lingkungan apa yang diatur dari udev dan dengan file
, Anda akan menemukan jenis file.
Atribut konkret untuk perangkat Anda dapat ditemukan dengan lsusb
lsusb
memberi
...
Perangkat Bus 001 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
...
Ini bukan tentang pertanyaan Anda secara langsung tetapi tentang apa yang Anda lakukan. Jika Anda memulai skrip cadangan dari udev, Anda akan menghadapi dua masalah utama :
- Skrip Anda mungkin dimulai sebelum perangkat siap dan dapat dipasang, Anda harus menjaga kondisi KERNEL=="sd*" jika Anda ingin menggunakan simpul /dev untuk memasangnya
- Yang lebih penting, jika skrip Anda membutuhkan waktu untuk dieksekusi (yang dapat dengan mudah terjadi pada skrip cadangan), skrip akan dimatikan segera setelah dimulai (sekitar 5 detik)
- Anda akan menghadapi banyak masalah izin pengguna yang rumit
Saran saya adalah membuat skrip di rumah pengguna Anda yang mendengarkan pipa bernama dan yang akan dimulai secara asinkron seperti :
#!/bin/bash
PIPE="/tmp/IomegaUsbPipe"
REMOTE_PATH="/path/to/mount/point"
LOCAL_PATH="/local/path/"
doSynchronization()
{
#your backup here
}
trap "rm -f $PIPE" EXIT
#If the pipe doesn't exist, create it
if [[ ! -p $PIPE ]]; then
mkfifo $PIPE
fi
#If the disk is already plugged on startup, do a syn
if [[ -e "$REMOTE_PATH" ]]
then
doSynchronization
fi
#Make the permanent loop to watch the usb connection
while true
do
if read line <$PIPE; then
#Test the message read from the fifo
if [[ "$line" == "connected" ]]
then
#The usb has been plugged, wait for disk to be mounted by KDE
while [[ ! -e "$REMOTE_PATH" ]]
do
sleep 1
done
doSynchronization
else
echo "Unhandled message from fifo : [$line]"
fi
fi
done
echo "Reader exiting"
Catatan:Saya menggunakan pemasangan otomatis dengan kde jadi saya memeriksa apakah folder tersebut muncul. Anda dapat meneruskan parameter /dev/sd* di fifo dari aturan udev dan memasangnya sendiri di skrip. Untuk menulis ke fifo, jangan lupa bahwa udev bukan shell dan pengalihan itu tidak berfungsi. LARI Anda harus seperti :
RUN+="/bin/sh -c '/bin/echo terhubung>> /tmp/IomegaUsbPipe'"
Saya telah memposting solusi di https://askubuntu.com/a/516336 dan saya juga menyalin-tempel solusinya di sini.
Saya menulis skrip Python menggunakan pyudev yang saya biarkan berjalan di latar belakang. Skrip itu mendengarkan acara udev (jadi, sangat efisien) dan menjalankan kode apa pun yang saya inginkan. Dalam kasus saya, ini menjalankan xinput
perintah untuk menyiapkan perangkat saya (tautkan ke versi terbaru).
Berikut adalah versi singkat dari skrip yang sama:
#!/usr/bin/env python3
import pyudev
import subprocess
def main():
context = pyudev.Context()
monitor = pyudev.Monitor.from_netlink(context)
monitor.filter_by(subsystem='usb')
monitor.start()
for device in iter(monitor.poll, None):
# I can add more logic here, to run different scripts for different devices.
subprocess.call(['/home/foo/foobar.sh', '--foo', '--bar'])
if __name__ == '__main__':
main()