Jak uruchomić niestandardowe skrypty na wtyczce urządzenia USB?
41
Jaka jest najnowocześniejsza metoda automatycznego wykonywania niestandardowych skryptów we wtyczce urządzenia USB w obecnych dystrybucjach systemu Linux, takich jak Debian / CentOS / Fedora?
Na przykład, jeśli chcesz automatycznie zamontować / skopiować niektóre pliki / odmontować urządzenie pamięci masowej USB na podstawie jego UUID (lub identyfikatora urządzenia itp.).
Dodaj klauzulę, np. NAME="subdir/mydisk%n"Jeśli chcesz użyć niestandardowej ścieżki wprowadzania w obszarze /dev.
Uruchom, udevadm info -a -n sdbaby zobaczyć, z którymi atrybutami możesz dopasować ( attribute=="value"; zamień sdbna nazwę urządzenia automatycznie przypisaną do dysku, odpowiadającą nowemu wpisowi utworzonemu /devpo podłączeniu go). Należy pamiętać, że można korzystać z ATTRSklauzul z dowolnej jednej zwrotce: można wybrać dowolną zwrotka, ale ATTRSklauzule wszystkie muszą pochodzić z tej samej zwrotki, nie można łączyć ze sobą. Możesz łączyć ATTRSklauzule z innymi typami klauzul wymienionymi w innej zwrotce.
Czy ta odpowiedź jest nadal aktualna? Pod żadnym pozorem nie mogę zmusić skryptu do wykonania (i dotknięcia pliku). Jeśli możesz podać najbardziej podstawowy przykład wykonania skryptu po podłączeniu czegokolwiek , byłoby świetnie, a my możemy pracować od tego momentu .
Redsandro
@ Redsandro Mam odmiany tej reguły w mojej konfiguracji udev i działają. Czy podłączyłeś urządzenie i włączyłeś je ponownie, czy uruchomiłeś udevadm trigger? Czy twój system używa udev? Jeśli chcesz uruchomić skrypt, gdy coś jest podłączone, usuń wszystkie warunki (klauzule z ==) (być może składnia wymaga jednego warunku, nie jestem pewien; jeśli tak, użyj KERNEL=="*").
Gilles „SO- przestań być zły”
Też tego próbowałem, ale skoro to działa dla ciebie, muszę przegapić krok. Mam przeniesiony na to pytanie tutaj , więc mogę napisać przykładowy kod.
Redsandro
Być może powiązane, myślę, że istnieje limit czasu, przez jaki skrypt może działać. Uważam, że jest bardzo krótki (jak 1 sekunda czy coś takiego). Jeśli to potrwa dłużej, udev go zabije. Możesz obejść ten problem, używając skryptu w tle z czymś podobnym at. Zobacz „Uruchamianie programów zewnętrznych” na reaktywowanym.net/writing_udev_rules.html
cheshirekow
Aby dodać do tego, ze względu na kompletność, plik musi mieć sufiks, .rulesa pliki w katalogu są odczytywane w porządku leksykalnym (konwencja używa prefiksu numerycznego, aby je uporządkować), i mogą być poniżej /etc/, /usr/liblub /run. Aby uzyskać więcej, RTFM .
starfry
14
Szukałem /lib/udev/rules.dprzykładów reguł związanych z dyskami. W systemie Ubuntu jeden plik reguł zawiera zmienną środowiskową, ID_FS_UUID_ENCktórej można używać we własnych plikach reguł.
Dlatego umieściłem niestandardowy plik reguł /etc/udev/rules.d/foodevice.rules. Ponieważ nie jest poprzedzony liczbą, jest w końcu uruchamiany przez udev. Przy okazji demon udev obserwował /etc/udev/rules.dzmiany, tak że nie trzeba go ponownie uruchamiać przy zmianach plików.
(jest to jedna zasada - musisz usunąć znak nowej linii po klauzuli ENV, ponieważ udev nie ma mechanizmu kontynuacji linii)
Program uruchamiany przez udev blokuje demona - dlatego nie powinien działać długo. Rozwiązałem to poprzez at- tj. Poprzez oderwanie się od procesu wykonującego prawdziwą pracę:
$ cat /home/juser/path/script.sh
#!/bin/sh
echo ~/path/mountcopystuff.sh | at now
Może być konieczne ponowne załadowanie reguł udev udevadm control --reload-rules, w zależności od dystrybucji.
user44038,
1
Zamiast at nowsugerować batch.
Przywróć Monikę - M. Schröder
Co robić, gdy nie masz atani batch? Jestem w środowisku osadzonym z busybox .
natenho
@natenho, możesz użyć ~/path/mountcopystuff.sh &- atitp. ma tę zaletę, że otrzymujesz powiadomienia e-mail na wypadek, gdyby coś poszło nie tak - ale w systemie wbudowanym prawdopodobnie nie jest to interesujące.
udevadm trigger
? Czy twój system używa udev? Jeśli chcesz uruchomić skrypt, gdy coś jest podłączone, usuń wszystkie warunki (klauzule z==
) (być może składnia wymaga jednego warunku, nie jestem pewien; jeśli tak, użyjKERNEL=="*"
).at
. Zobacz „Uruchamianie programów zewnętrznych” na reaktywowanym.net/writing_udev_rules.html.rules
a pliki w katalogu są odczytywane w porządku leksykalnym (konwencja używa prefiksu numerycznego, aby je uporządkować), i mogą być poniżej/etc/
,/usr/lib
lub/run
. Aby uzyskać więcej, RTFM .Szukałem
/lib/udev/rules.d
przykładów reguł związanych z dyskami. W systemie Ubuntu jeden plik reguł zawiera zmienną środowiskową,ID_FS_UUID_ENC
której można używać we własnych plikach reguł.Dlatego umieściłem niestandardowy plik reguł
/etc/udev/rules.d/foodevice.rules
. Ponieważ nie jest poprzedzony liczbą, jest w końcu uruchamiany przez udev. Przy okazji demon udev obserwował/etc/udev/rules.d
zmiany, tak że nie trzeba go ponownie uruchamiać przy zmianach plików.Treść
/etc/udev/rules.d/foodevice.rules
jest:(jest to jedna zasada - musisz usunąć znak nowej linii po klauzuli ENV, ponieważ udev nie ma mechanizmu kontynuacji linii)
Program uruchamiany przez udev blokuje demona - dlatego nie powinien działać długo. Rozwiązałem to poprzez
at
- tj. Poprzez oderwanie się od procesu wykonującego prawdziwą pracę:źródło
udevadm control --reload-rules
, w zależności od dystrybucji.at now
sugerowaćbatch
.at
anibatch
? Jestem w środowisku osadzonym z busybox .~/path/mountcopystuff.sh &
-at
itp. ma tę zaletę, że otrzymujesz powiadomienia e-mail na wypadek, gdyby coś poszło nie tak - ale w systemie wbudowanym prawdopodobnie nie jest to interesujące.