Pokud chcete skript spustit na konkrétním zařízení, můžete použít ID dodavatele a produktu
-
V
/etc/udev/rules.d/test.rules
:ATTRS{idVendor}=="152d", ATTRS{idProduct}=="2329", RUN+="/tmp/test.sh"
-
v
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
S env
, můžete vidět, jaké prostředí je nastaveno z udev a pomocí file
, zjistíte typ souboru.
Konkrétní atributy pro vaše zařízení lze zjistit pomocí lsusb
lsusb
dává
...
Bus 001 Device 016:ID 152d:2329 JMicron Technology Corp. / JMicron USA Technology Corp. JM20329 SATA Bridge
...
Nejde přímo o vaši otázku, ale o to, co děláte. Pokud spustíte zálohovací skript z udev, budete čelit dvěma hlavním problémům:
- Váš skript může být spuštěn dříve, než bude zařízení připraveno a bude možné jej připojit, pokud chcete k připojení použít uzel /dev, musíte zachovat podmínku KERNEL=="sd*"
- Důležitější je, že pokud spuštění vašeho skriptu nějakou dobu trvá (což může být snadno případ záložního skriptu), bude ukončen krátce po jeho spuštění (asi 5 s)
- Budete čelit mnoha komplikovaným problémům s uživatelskými oprávněními
Moje rada je vytvořit skript ve vašem uživatelském domově, který naslouchá pojmenovanému kanálu a který bude spuštěn asynchronně jako:
#!/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"
Poznámka:Používám automatické připojení s kde, takže zkontroluji, zda se složka zobrazuje. Parametr /dev/sd* můžete předat do fifo z pravidla udev a sami jej připojit do skriptu. Chcete-li napsat do fifo, nezapomeňte, že udev není shell a že nefunguje přesměrování. Váš RUN by měl být takto:
RUN+="/bin/sh -c '/bin/echo připojeno>> /tmp/IomegaUsbPipe'"
Uveřejnil jsem řešení na https://askubuntu.com/a/516336 a řešení také zkopíruji a vložím sem.
Napsal jsem skript Python pomocí pyudev, který nechávám běžet na pozadí. Tento skript poslouchá události udev (je tedy velmi efektivní) a spouští jakýkoli kód, který chci. V mém případě běží xinput
příkazy pro nastavení mých zařízení (odkaz na nejnovější verzi).
Zde je krátká verze stejného skriptu:
#!/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()