Chcę wykonać skrypt po podłączeniu urządzenia do komputera z systemem Linux. Na przykład uruchom xinput
na myszy lub w kopii zapasowej na określonym dysku.
Widziałem wiele artykułów na ten temat, ostatnio tu i tutaj . Ale po prostu nie mogę go uruchomić.
Oto kilka prostych przykładów, które próbują uzyskać przynajmniej pewien rodzaj odpowiedzi.
/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 reguł jest obserwowany inotify
i powinien być natychmiast aktywny. Ciągle ponownie instaluję klawiaturę, mysz, tablet, pamięć i dysk USB, ale nic. Nie dotknięto pliku dziennika.
Jaki byłby najprostszy sposób, aby przynajmniej wiedzieć, że coś działa? Łatwiej jest pracować z czegoś, co działa, niż z czegoś, co nie działa.
udevadm trigger
lub podłączyłeś urządzenie, aby zastosować nową regułę?3.5.0-23-generic
.Odpowiedzi:
Jeśli chcesz uruchomić skrypt na określonym urządzeniu, możesz użyć identyfikatora dostawcy i produktu
W
/etc/udev/rules.d/test.rules
:w
test.sh
:Za pomocą
env
możesz zobaczyć, jakie środowisko jest ustawione w udev, a za pomocąfile
odkryjesz typ pliku.Konkretne atrybuty urządzenia można odkryć za pomocą
lsusb
daje
źródło
ACTION=="add",
bezpośrednio do definicji reguły.Nie chodzi bezpośrednio o twoje pytanie, ale o to, co robisz. Jeśli uruchomisz skrypt kopii zapasowej z udev, napotkasz dwa główne problemy:
Moja rada to utworzenie skryptu w domu użytkownika, który będzie nasłuchiwał nazwanego potoku i który zostanie uruchomiony asynchronicznie:
Uwaga: Używam automatycznego montowania z KDE, więc sprawdzam, czy folder się pojawia. Możesz przekazać parametr / dev / sd * w fifo z reguły udev i zamontować go sam w skrypcie. Aby pisać w fifo, nie zapominaj, że udev nie jest powłoką i że przekierowanie nie działa. Twój RUN powinien wyglądać następująco:
RUN + = "/ bin / sh -c '/ bin / echo connected >> / tmp / IomegaUsbPipe'"
źródło
Opublikowałem rozwiązanie na /ubuntu//a/516336, a także tutaj kopiuję i wklejam rozwiązanie.
Napisałem skrypt Pythona używając pyudev, który pozostawiam uruchomiony w tle. Ten skrypt nasłuchuje zdarzeń udev (dlatego jest bardzo wydajny) i uruchamia dowolny kod, jaki chcę. W moim przypadku uruchamia
xinput
polecenia, aby skonfigurować moje urządzenia ( link do najnowszej wersji ).Oto krótka wersja tego samego skryptu:
źródło
call()
. W ten sposób, jeśli konieczne jest dostarczenie argumentów dofoobar.sh
skryptu, możesz to zrobić dynamicznie.Aby uruchomić skrypt podczas rozruchu po włożeniu urządzenia USB, korzystam z rozwiązania poniżej:
Sformatuj pendrive lub inną pamięć USB i nadaj jej nazwę. Następnie
/etc/rc.local
dodaj linięls -q /dev/disk/by-label > /home/pi/label.txt
utworzy plik txt o nazwie label.txt (może mieć dowolną inną nazwę)
następnie ponownie w /etc/rc.local dodaj kolejne 2 linie:
Teraz za każdym razem, gdy wstawiany jest pendrive o nazwie USB_drive_name, uruchamia skrypt.
Z kilkoma małymi modyfikacjami powyższego rozwiązania można użyć, gdy system jest uruchomiony.
źródło
udev
na inne czasy nie jest „kilkoma małymi modyfikacjami”) i Raspberry Pi. Istnieje niepotrzebnesudo
-rc.local
działa jako root, jest to problem z eskalacją uprawnień - plik, który może edytować zwykły użytkownik, jest uruchamiany jako root.