Automatische Aktion nach USB einstecken

  • Hallo,
    leider komme ich gerade nicht weiter mit meinem vorhaben, ein Skript zu starten nach dem ein USB Stick eingesteckt worden ist.
    Aber so weit komme ich noch gar nicht, in Anlehnung an diesem Thread #15 von meigrafd, wollte ich zum Testen nur mal eine Testausgabe erzeugen, aber auch dies klappt schon nicht. Später einmal soll es ein Skript starten, welches prüft ob auf dem USB Stick ein Update für ein Pythonprogramm liegt, und wenn ja, dieses auf dem Pi kopieren, aber wie gesagt soweit bin ich noch gar nicht.

    Folgender Stand herrscht jetzt auf dem Pi:

    /etc/udev/rules.d/90-usbautomount.rules:

    Code
    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh mount /dev/%k"
    ACTION=="remove", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh umount /dev/%k"
    Code
    -rw-r--r-- 1 root root 199 Jul 20 15:28 90-usbautomount.rules

    /bin/usbmount.sh:

    Code
    -rwxr-x--x 1 root root    865 Jul 20 15:43 usbmount.sh


    Das auskommentierte stammt vom anderen Thread, das habe ich auskommentiert da ich dies ja nicht benötige.
    Leider wird weder in die log.txt geschreiben, noch test.txt erstellt, die log.txt hab ich auch zur vorsicht mal angelegt, aber auch dann wird dorthin nix geschrieben.

    Eigentlich sehe ich keine Abweichungen zu dem oben genannten Thread, oder überseh ich mal wieder was?

    Vielen Dank schon mal im Voraus für eure Hilfe

  • Beim auskommentieren im usbmount.sh hast du eine "done" Zeile übersehen... und sorgt für ein Syntax Error

    Merke:
    Wenn das Script manuell nicht ausgeführt werden kann dann geht das auch nicht über udev etc
    :fies:

  • Ach das "Done" bezieht sich ja auf die Schleife, nicht auf das if. Ja ich weiß schon warum das usbmount.sh nur das eigentliche mount ausführen soll und mir dann ein Pythonskript startet :)

    Ja der Merksatz ist natürlich hier auch anzuwenden, bei crontabs mach ich das mittlerweile eh schon immer, warum hier nicht, das weiß wohl keiner


    So jetzt ist mir aber noch was aufgefallen, folgendes:
    1x USB Stick einstecken bewirkt 2 Zeilen "Hallo USB Stick" in der Log.txt, warum ?

  • So habe den Fehler gefunden, wundert mich, denn diesen Fehler müsste der Themenerstellen im verlinkten Thread auch gehabt haben.

    Falsch:

    Code
    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*", RUN+="/bin/bash /bin/usbmount.sh mount /dev/%k"

    Richtig:

    Code
    ACTION=="add", SUBSYSTEMS=="usb", KERNEL=="sd*[0-9]", RUN+="/bin/bash /bin/usbmount.sh mount /dev/%k"

    Die Änderung ist in KERNEL==

    Da beim einstecken bsp. sda und anschließend bsp. sda1 erkannt wird, bekam ich 2 Einträge. Hätte der USB Stick 2 Partitionen gehabt, wären es 3 Einträge gewesen.

    Deswegen habe ich jetzt sd*[0-9] diese Lösung im Einsatz, wobei auch sd?1 bzw sd? gegangen wären (eigentlich).
    Erschwerend kam hinzu, dass wie zwar auf Ubuntu anders behauptet:

    Zitat von https://wiki.ubuntuusers.de/udev/#Neustart-des-udev-Systems

    Neustart des udev-Systems
    Ein Neustart von udev ist eigentlich nicht erforderlich, da udev beim Anschließen eines neuen Gerätes automatisch die Regeln im Verzeichnis /etc/udev/rules.d/ durchgeht. Wurde die Regel für entfernbare Geräte erstellt, können diese einfach entfernt und wieder eingesteckt werden. Wurden dagegen Regeln für fest eingebaute Geräte (z.B. PCI-Karten) festgelegt, muss udev aber dazu veranlasst werden, alle Geräte neu einzulesen. Dies geschieht mittels:

    Code
    sudo udevadm trigger


    Falls es dennoch notwendig sein sollte, udev neu zu starten, verwendet man den Befehl:

    Code
    sudo reload udev

    ich sehr wohl udev neu starten musste, damit er mir die oben genannten Änderungen übernahm

    Ich hoffe ich kann hiermit vielleicht irgendwem mal weiter helfen der vor dem selben Problem wie ich steht.

    So dann kann es nun nach langem suchen weiter gehen mit dem eigentlichen Skript wofür ich das ganze brauche :D mal sehen welche Fehlerteufel da heute noch auf mich warten :angel:

    Danke an meigrafd für deine Hilfestellung, wie bei so gut wie jedem Thread von mir!

  • Im Original Tutorial werden 3 verschiedene Möglichkeiten für KERNEL== beschrieben: FAQ => Nützliche Links / Linksammlung => Laufwerk/Gerät immer der selben Gerätedateien zuweisen (udev)
    ...und da steht auch: " Um sicher zu gehen das aber auch die Rule wirklich nur bei einer Partitions-Nummer (sda1) und nicht dem vollständigen Device (sda) ausgeführt wird, solltet ihr aber auf jedenfall mit der ersten oder zweiten Methode arbeiten! "

  • Hehe ja da hast du wieder recht, meine Anmerkung bezog sich nur auf den verlinkten Thread, dadurch sind bei Ihm damals wohl die Filme immer doppelt kopiert worden xD

    Jedenfalls habe ich heute mein Tagesziel erreicht, dass mir dieses Skript automatisch beim anstecken des USB Sticks ausgeführt wird:

    Vielen :danke_ATDE: für deine Hilfe

  • Versuch so viel wie möglich nativ in der jeweiligen Sprache umzusetzen, sprich, verzichte so gut es geht auf 'subprocess'. Das kopieren der Dateien kannst du mit dem Module shutil bewerkstelligen: https://stackoverflow.com/a/123238/2641799
    Auch solltest du es vermeiden "file" zu verwenden bzw überschreibst du mit dieser Benennung die interne Methode "file".

  • Stimmt, wenn ich darüber nachdenke ist es sinnvoller Python eigene Module zu verwenden um soetwas zu bewerkstelligen.

    Das mit file wusst ich nicht dass es hierfür eine interne Methode dafür gibt, muss auch gestehen dass dieses "file" ein "restbestand" eines Tutorials ist, wo ich mit dem with open() gespielt habe.

    Muss ich mal das eigentliche Programm (Projekt) posten, da gibts bestimmt vieles was konstruktive Kritik verträgt :D

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!