Odpowiedzi:
Teraz systemd oferuje o wiele ładniejsze rozwiązanie . Tworzysz usługę zależną i pożądaną przez Ciebie media, np .:/etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/home/you/bin/triggerScript.sh
[Install]
WantedBy=media-YourMediaLabel.mount
Następnie musisz uruchomić / włączyć usługę:
sudo systemctl start your.service
sudo systemctl enable your.service
Po zamontowaniu systemd uruchamia skrypt wyzwalacza. Przewagą nad regułą udev jest to, że skrypt naprawdę uruchamia się po zamontowaniu, a nie po dodaniu urządzenia systemowego.
Przypadek użycia : mam zaszyfrowaną partycję, którą chcę automatycznie wykonać kopię zapasową. Po dodaniu urządzenia muszę wpisać hasło. Jeśli podłączyłem skrypt kopii zapasowej do udev, skrypt próbuje uruchomić się w momencie, gdy wpisuję hasło, co się nie powiedzie.
Zasób: Skrypty z udev
Uwaga: Możesz znaleźć swoje urządzenie z:systemctl list-units -t mount
systemctl enable your.service
. Plik skryptu musi być wykonywalny.
Requires=
, After=
i WantedBy=
linie zarówno z media-bb.mount
i media-BB.mount
dlatego Nautilus pokazuje mi objętości jako „BB”, a nie „BB”. Ten sam komunikat o błędzie, z wyjątkiem wielkich liter. Co jest nie tak? Czy muszę jakoś stworzyć tę media-<something>.mount
usługę?
Zacznij od znalezienia swojego urządzenia w lsusb
. Zanotuj identyfikator (np. 0a81:0101
)
Utwórz nowy plik reguł udev w /etc/udev/rules.d/
via sudoedit /etc/udev/rules.d/100-mount-videos.rules
i umieść tam nową regułę w następujący sposób:
ACTION=="add", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0101", RUN+="/home/your_username/bin/mount_videos.sh"
Zwróć uwagę, jak użyłem identyfikatora z lsusb
.
Następnie wystarczy napisać skrypt, aby wykonać pracę. Proste polecenie montowania powinno działać. Możesz potrzebować tam sleep 5
komendy, aby poczekać na zainicjowanie systemu plików (jeśli zostawisz gnome, aby wykonać główne montowanie - ale możesz go najpierw zainstalować, a potem możesz nie potrzebować snu).
Dodatek od Allana: długo działające skrypty mogą blokować „wszystkie dalsze zdarzenia dla tego lub zależnego urządzenia”. Moja strona podręcznika Mint stwierdza ponadto: „Długoterminowe zadania należy natychmiast odłączyć od samego procesu zdarzenia”. Nie podaje się wskazówek, gdzie zdobyć umiejętności, aby to zrobić.
Odpowiedź od Oli: Zawiń to tak: https://askubuntu.com/a/106359/449
/root/
miejscu, gdzie tylko root może go edytować.
Innym sposobem uzyskania wartości ATTRS {idVendor} i ATTRS {idProduct} (testowany w Ubuntu 12.04) jest:
Znajdź, gdzie zamontowany jest twój usb:
$ mount | grep /dev/sd*
pokazuje to coś takiego:
/dev/sdb on /media/SOMEDIR type vfat ...
Użyj udevadm, aby uzyskać informacje o tym urządzeniu:
udevadm info -q all -n /dev/sdb | grep -E -i -w '.*VENDOR_ID.*|.*MODEL_ID.*'
wynik powinien być podobny do:
E: ID_MODEL_ID=001a
E: ID_VENDOR_ID=002b
Teraz użyj identyfikatora modelu dla ATTRS {idProduct} i identyfikatora dostawcy dla ATTRS {idVendor}
ACTION=="add", ATTRS{idVendor}=="002b", ATTRS{idProduct}=="001a" ...
W Nautilus w Edycja> Preferencje> Media możesz wybrać „inną akcję” niż „komendę kostiumową”. do wykonania różnego rodzaju mediów. Do tego czasu dysk USB jest już zamontowany, ale przypuszczam, że nadal możesz go połączyć (za pomocą komendy costum) z folderem, w którym dysk ma się pojawiać. Nie wiedziałem, czy jest to łatwiejsze, czy lepsze niż używanie udev.
Jeśli nie chcesz zakłócać kontroli nad menedżerem plików (nautilus, konquerer, gnome itp.) Nad montowaniem i odmontowywaniem urządzenia, sugeruję, aby nie iść drogą udev.
Zamiast tego użyj udisks-glue, jeśli twój system używa udisk (prawie wszyscy tak robią).
Po instalacji po prostu utwórz plik konfiguracyjny ~/.udisks-glue.conf
w swoim katalogu domowym w ten sposób.
Mój poniższy przykład aktualizuje dane GPS-Assist w moim aparacie za każdym razem, gdy podłączam kartę SD.
filter BT16EXTREME {
optical = false
partition_table = false
usage = filesystem
label = BT16EXTREME
}
match BT16EXTREME {
post_mount_command = "/home/bernhard/update-gps-assist-data.pl %mount_point"
}
Następnie upewnij się, że udisks-glue uruchamia się podczas uruchamiania lub logowania. Tj. Za pomocą aplikacji startowych gnome
Odpowiedź @ sumid ma problem. Należy nie uruchomić usługę. Musisz go tylko włączyć.
plik: /etc/systemd/system/your.service
[Unit]
Description=My flashdrive script trigger
Requires=media-YourMediaLabel.mount
After=media-YourMediaLabel.mount
[Service]
ExecStart=/any_path_even_inside_the_mount_point/script.sh
[Install]
WantedBy=media-YourMediaLabel.mount
Następnie włącz usługę:
sudo systemctl enable your.service
To wszystko.
Uwaga: etykietę medialną możesz znaleźć za pomocą:sudo systemctl list-units -t mount
Uwaga 2: Jeśli usługa jakoś się nie powiedzie (na przykład skrypt nie jest wykonywalny), punkt podłączenia zmieni się na <old_mount_point_name>1
następnym razem, gdy podłączasz urządzenie USB. Aby rozwiązać ten problem, wystarczy wykonaćsudo systemctl reset-failed