Wo Python Script starten, nachdem GPIO, i2c und SPI initialisierit wurden?

  • Ich möchte auf einem RasPi frühstmöglich während des Bootvorgangs ein Python Script im Background starten (&). Allerdings muss dann auch i2c, SPI und GPIO bereit stehen. Das Script soll dann diverse Module schon aktivieren könenn, Parameter dort setzen und ein Relais schalten. Das alles schnellstmöglich nach dem Einschalten, unabhängig davon ob der RasPI das entsprechende System dann schon komplett gebootet hat.
    Meine Frage als jemand der von Linux noch sehr wenig Ahnung hat daher: Wo kann muss ich das Python Script genau einfügen, um nach SPI, i2c und GPIO Init sofort loslegen zu können?

    Danke für Eure Antworten!

    Einmal editiert, zuletzt von thehassle (18. Juni 2016 um 23:04)

  • Wo Python Script starten, nachdem GPIO, i2c und SPI initialisierit wurden?? Schau mal ob du hier fündig wirst!

  • Das wird wohl nicht so einfach funktionieren, wie Du dir das wünscht. Ohne initialisierte Geräte u. laufendes OS wird Python nicht laufen. Mit einem abgesetzten AVR, Arduino o.ä. wäre dies ( mit Einschränkungen ) aber bestimmt möglich. Wenn der RPi dann läuft, könnte dieser dann auch die Steuerung der Sensoren bzw. der Relais übernehmen.

  • Na, bevor der RasPI fertig gebootet hat, wird ja irgendwann innerhalb des Bootprozesses GPIO, i2c, SPI und Python intialisiert sein, oder? Und da können ja noch ein paar Sekunden vergehen, bis dann der Systemprompt kommt. Da jede Sekunde zählt, ist jede Sekunde vor dem Prompt Gold wert.

  • Python wird nicht initialisiert. Der Python-Interpreter kann erst aufgerufen (gestartet) werden, wenn das System komplett hochgefahren ist. Somit kann ein Python-Script auch erst dann gestartet werden..Python ist also nicht geeignet, bereits vor Abschluss des Bootvorgangs etwas zu steuern.

  • Servus Jörg,


    ... Der Python-Interpreter kann erst aufgerufen (gestartet) werden, wenn das System komplett hochgefahren ist. ...

    definiere mal "komplett hochgefahren" ...
    Sobald die Dateisysteme eingehängt sind und der Zugriff auf das binary möglich ist, kann imho der Python-Interpreter aufgerufen werden. Ich wüsste zumindest nicht, was dagegen sprechen würde. Ist ja auch nur ein Interpreter wie z.b. bash oder php.
    So gesehen ist das imho durchaus möglich vor Erreichen des Runlevel 2 oder höher ein Python-script auszuführen.
    Der wicd z.B. ist auch ein Python-script und wird ab Runlevel 2 ( weil Netzwerk ) gestartet ...
    So gesehen wäre es m.E. dem TO durchaus möglich sein script bereits auszuführen, wenn der komplette Bootvorgang noch nicht abgeschlossen ist.

    cu,
    -ds-

  • NOOBS ist eine schlechte Wahl für sowas. Wenn du sowieso nur ein Betriebssystem nutzen willst dann flash dir das Image lieber direkt.


    Seit Debian Jessie (Raspbian ist Debian für Raspberry) übernimmt systemd den Startvorgang, wodurch das System generell schneller startet.

    Die Scripte in /etc/init.d/ (und somit LSBInitScripts) gehören zum alten Verfahren sysVinit und starten später als es mit systemd ermöglicht wird. Auch /etc/rc.local wird ziemlich spät ausgeführt.
    Es wäre also besser ein systemd Unit File zu erstellen und dort den Zeitpunkt festzulegen:

    Spoiler anzeigen
    Code
    sudo nano /etc/systemd/system/jumpstart.service
    Code
    sudo nano /usr/local/sbin/jumpstart && sudo chmod +x /usr/local/sbin/jumpstart
    Code
    sudo systemctl enable jumpstart

    Man kann auch einen Graphen erzeugen lassen, wie lange das booten gedauert hat aber vor allem wann welcher Dienst gestartet wurde oder wie lange den Bootvorgang ausgebremst (dunkelrot) hat:

    Code
    sudo systemd-analyze plot > /tmp/startup.svg


    die dadurch erzeugte *.svg kann man dann mit einem Webbrowser betrachten, entweder über einen Webserver auf dem Pi, oder die Datei auf den eigenen Computer übertragen und via Drag&Drop zB in Firefox.


    Wenn das Script abhängig von I2C ist und möglichst sofort gestartet werden soll sobald I2C initialisiert wurde, würde ich allerdings UDEV empfehlen. UDEV überwacht quasi alle Kernel Meldungen - grob gesagt.

    Man kann Regeln angeben, indem man im Verzeichnis /etc/udev/rules.d/ eine Steuerdatei anlegt. Der numerische Präfix des Dateinamens regelt dabei die Reihenfolge der Abarbeitung der Dateien.
    Für I2C legt man zB die Datei /etc/udev/rules.d/51-i2c.rules an und trägt darin die folgende Regel ein:

    Code
    KERNEL="i2cdev*", RUN+="/bin/bash /usr/local/sbin/startI2C.sh"
    # oder
    SUBSYSTEM=="i2c-dev", RUN+="/bin/bash /usr/local/sbin/startI2C.sh"


    Damit wird ein bash Script /usr/local/sbin/startI2C.sh ausgeführt. In diesem Script trägst du dann eine Zeile ein um dein Python Script in den Hintergrund zu schicken, und wichtig ist das am Ende der bash Datei ein "exit 0" vorkommt...
    Werf auch mal ein Blick in die Datei /etc/udev/rules.d/99-com.rules

    Siehe dazu auch FAQ => Nützliche Links / Linksammlung => UDEV


    //EDIT: raspiprojekt: Das stimmt nicht. Wie dreamshader schon richtig schrieb kann python sofort nachdem sein Dateisystem vorhanden ist gestartet werden und das ist schon recht früh der Fall: nachdem "local-fs.target" von systemd ausgeführt wurde.

  • Moin,
    dreamshader hast du schon Kopfschmerzen??

    Gruss Bernd

    Ich habe KEINE Ahnung und davon GANZ VIEL!!
    Bei einer Lösung freue ich mich über ein ":thumbup:"
    Vielleicht trifft man sich in der RPi-Plauderecke.
    Linux ist zum Lernen da, je mehr man lernt um so besser versteht man es.

Jetzt mitmachen!

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