Python Programm startet nicht per Autostart

  • Hallo,


    ich habe einen Raspberry B und einen Raspberry Zero W und diese kommunizieren

    miteinander über UDP. Das funktioniert auch einwandfrei, allerdings bekomme ich es nicht

    hin, das Programm auf dem Zero per Autostart zu starten.

    Ich habe es genau so gemacht wie auf dem Raspberry B:

    Erste Zeile im Programm: #!/usr/bin/env python

    Der Eintrag in der rc.local: /bin/sleep 180 && /home/pi/LS_s.py &

    Und die Datei startbar gemacht: sudo chmod +x /home/pi/LS_s.py


    Starte ich die rc.local kommen folgende Fehlermeldungen:


    Das ist das Programm:

    Ist nicht schön, läuft aber tagelang ohne Probleme und tut, was es soll.


    Woran könnte das liegen?


    Gruß Reinhard

    Edited 2 times, last by Linus: Datenschutz ().

  • Es ist etwas verwirrend wenn du manuell /etc/rc.local ausführst und die Ausgabe postest... Zumal du /etc/rc.local dem Interpreter sh übergibst... Ist die Datei selbst ausführbar? Wenn nicht = Fail.


    /bin/sleep 180 && /home/pi/LS_s.py ist ebenfalls etwas komisch... Wieso möchtest du /etc/rc.local um 180 Sekunden verzögern bevor dein Python Script ausgeführt wird?


    Die Fehlermeldung sieht zudem so aus als würde das Script nicht vom Shebang verarbeitet werden... Schon mal versucht bei Ausführung die Datei direkt dem Interpreter zu übergeben? (die Zeile über deiner künstlichen Verzögerung)

    Ansonsten: Shebang direkt auf den Interpreter setzen.


    Das Script selbst sieht ebenfalls komisch aus... Welchen Zweck erfüllt socket?

    Und zu guter letzt: Du setzt nicht überall den absoluten Pfad zur bild.jpg. Das kann dir irgendwann zum Verhängnis werden.





    PS: Mach lieber dein Telegram_Bot_TOKEN unkenntlich, sonst kapert dir den jemand.

  • Es ist etwas verwirrend wenn du manuell /etc/rc.local ausführst und die Ausgabe postest... Zumal du /etc/rc.local dem Interpreter sh übergibst... Ist die Datei selbst ausführbar? Wenn nicht = Fail.

    Das hatte ich nur mal versucht, weil ich es in der Anleitung gelesen hatte, wie man ein Programm automatisch startet.



    /bin/sleep 180 && /home/pi/LS_s.py ist ebenfalls etwas komisch... Wieso möchtest du /etc/rc.local um 180 Sekunden verzögern bevor dein Python Script ausgeführt wird?

    Die Zeitverzögerung war auf den anderen Raspberry, also den Client, notwendig, ohne hat es nicht funktioniert , weil scheinbar irgendwas noch nicht bereit war. Mit funktioniert es auf diesem einwandfrei und ich hatte es einfach übernommen.

    Die Fehlermeldung sieht zudem so aus als würde das Script nicht vom Shebang verarbeitet werden... Schon mal versucht bei Ausführung die Datei direkt dem Interpreter zu übergeben? (die Zeile über deiner künstlichen Verzögerung)

    Ansonsten: Shebang direkt auf den Interpreter setzen.

    Probiere ich gleich mal.

    Das Script selbst sieht ebenfalls komisch aus... Welchen Zweck erfüllt socket?

    Kann raus, muß ich alles noch bereinigen.



    Und zu guter letzt: Du setzt nicht überall den absoluten Pfad zur bild.jpg. Das kann dir irgendwann zum Verhängnis werden.

    Korrigiere ich.

    Ich gehe alles noch mal durch, aber wie schon geschrieben, die Programme laufen auf beiden Raspberrys schon tagelang einwandfrei. Nur auf dem Zero klappt der Autostart nicht.


    Danke für die Antwort!


    Gruß Reinhard

  • Das Betriebssystem ist auf allen Pi's identisch, einzig Kernel & Firmware können sich unterscheiden, haben aber auf diese Art von Autostart keinen Einfluss. Es gibt btw mehrere Autostart-Möglichkeiten.


    Ich würde die Ursache des Problems wie gesagt eher im Detail suchen:

    • /etc/rc.local muss Ausführrechte besitzen, sonst kann die Datei bei Systemstart nicht ausgeführt werden.
      • /etc/rc.local sollte man tunlichst nicht überschreiben, sondern wenn dann nur bearbeiten. Dann bleiben auch Ausführrechte etc erhalten.
    • Der Server muss selbstverständlich zu einem früheren Zeitpunkt erreichbar sein als der Client versucht eine Verbindung herzustellen.
      • Spielt Socket keine Rolle bedarf es auch keiner Verzögerung/Blockade ala sleep
    • Die Python-Script-Datei muss im Linux-Kompatiblen Format vorliegen.
      • Dazu gehört auch der Zeilenumbruch. Ggf. Übertragung von PC auf Pi kontrollieren. Wurde /etc/rc.local überschrieben ebenfalls diese Script-Datei kontrollieren.
    • Entweder die Python-Script-Datei direkt dem Interpreter zum verarbeiten übergeben, oder mit Ausführrechten und Shebang arbeiten.
      • Wird die Datei direkt dem Interpreten übergeben wird ein Shebang ignoriert: python /home/pi/LS_s.py
      • Unter Umständen befindet sich der im Shebang befindliche Befehl nicht im PATH - dort wo Linux nach den Befehlen sucht, zB ist ls auch nur ein Binary welches ausgeführt wird... Durch Angabe des absoluten Pfades umgeht man ggf PATH Probleme.
  • Hallo meigrafd,


    habe mit alles noch mal angeschaut, die Berechtigungen sind gesetzt, in der Pfadvariablen steht alles drin und ich habe die Dateien auch nur direkt auf dem Raspberry mit idle erstellt bzw. bearbeitet.

    Das Programm läuft auch tadellos und tagelang, wenn ich es in idle starte.

    Übrigens ist Socket doch nicht überflüssig, ich empfange damit vom anderen Raspberry, der die Lichtschranke überwacht, das Signal zum Schießen des Fotos.

    Schau dir doch bitte mal die Ausgabe im Terminal an, gleich zum Beginn des Treads, da werden die Fehler ja schon mach den 180 Sekunden Zeitverzögerung angezeigt:


    Code
    exit 0
    + exit 0
    + /bin/sleep 180
    pi@raspberrypi:~ $ + /home/pi/LS_s.py
    /home/pi/LS_s.py: 1: /home/pi/LS_s.py: #!/usr/bin/env: not found
    /home/pi/LS_s.py: 2: /home/pi/LS_s.py: import: not found
    /home/pi/LS_s.py: 3: /home/pi/LS_s.py: import: not found
    /home/pi/LS_s.py: 4: /home/pi/LS_s.py: import: not found
    /home/pi/LS_s.py: 6: /home/pi/LS_s.py: Syntax error: "(" unexpected
    pi@raspberrypi:~ $

    In der 5. Zeile findet es scheinbar die Datei "env" nicht, sie ist aber vorhanden.


    Gruß Reinhard

  • Schon mal versucht anstatt env direkt den Pfad zum Interpreter zu setzen?

    Code
    #!/usr/bin/python
    import telepot
    import picamera
    import socket
    # ....

    Ansonsten - wie schon gesagt - nicht mit Shebang arbeiten sondern die Datei beim ausführen dem Interpreter übergeben:

    Code
    python /home/pi/LS_s.py

    Dann spielt der Shebang nämlich keine Rolle.



    ..ich wiederhole mich ungerne..

  • Wenn ich das Programm mit dem Befehl:


    python /home/pi/LS_s.py &


    in der rc.locale starte, dann funktioniert der Autostart:


    Code
    pi@raspberrypi:~ $ ps -ef | grep python
    root 326 1 0 11:20 ? 00:00:02 python /home/pi/LS_s.py
    pi 804 784 0 11:26 pts/0 00:00:00 grep --color=auto python
    pi@raspberrypi:~ $

    Allerdings funktioniert dann die Kamera nicht.

    Das Programm empfängt zwar über UDP die Daten vom anderen Raspberry und sendet per Telegramm auch ein Bild, es ist aber ein alter Bild, es wird kein Neues aufgenommen.

  • Schon mal versucht anstatt env direkt den Pfad zum Interpreter zu setzen?

    Gerade probiert, funktioniert auch nicht.


    Mit:

    Code
    /bin/sleep 180 && python /home/pi/LS_s.py &

    in der rc.locale scheint alles zu funktionieren, ich teste noch mal alles in Ruhe.

    Ohne Zeitverzögerung funktioniert die Kamera einfach nicht.

    Edited once, last by ReinhardT: neue Erkenntnisse ().

  • Wenn ich das Programm mit dem Befehl:


    python /home/pi/LS_s.py &


    in der rc.locale starte, dann funktioniert der Autostart:

    Und was spricht dagegen diese Variante zu verwenden?

    Das Programm empfängt zwar über UDP die Daten vom anderen Raspberry und sendet per Telegramm auch ein Bild, es ist aber ein alter Bild, es wird kein Neues aufgenommen.

    Dann schreib das Script mal passender:

    ..dann wäre es auch sinnvoll tmpfs für /tmp/ zu aktivieren - um die unnötigen Schreibvorgänge auf der SD zu vermeiden, sonst lebt die SD nicht lange..

  • Und was spricht dagegen diese Variante zu verwenden?

    Gar nichts.


    Danke, das du dir so viel Mühe gibst!


    Wenn ich dein Programm in Idle starte, kommt diese Fehlermeldung:


    Ich stelle mich sicher wirklich ungeschickt an, ist eventuell dem Alter geschuldet. :(

  • Zum testen am besten nicht in IDLE ausführen sondern schon über die Konsole - der Autostart nutzt ja auch nicht IDLE, zumal die IDLE-Umgebung etwas anders ist als über Konsole.


    Stell auch sicher das sonst kein anderes Script auf die RaspiCam zugreift.. Evtl. läuft auch noch das via Autostart ausgeführte Script im Hintergrund?


    Wichtig ist dass solche Ressourcen, die geöffnet wurden, auch nach Benutzung wieder geschlossen werden, sonst kriegst du irgendwann Probleme... In deinem Script aus Beitrag#1 hast du zB image_path zwar geöffnet aber nie geschlossen. Das try: Konstrukt hast du da auch etwas unpassend verwendet wodurch ggf cam nie geschlossen wurde sobald das Script beendet wurde. with kümmert sich eigenständig ums schließen. Mein Script ist auch noch nicht perfekt, wollte nur nicht zu viel auf ein mal ändern...

    Ggf. musst du jetzt ein mal rebooten damit der Out of resources Fehler verschwindet - durch das ganze rumprobieren zu viele noch offene handler.

  • Du hast natürlich Recht, das Programm lief im Hintergrund.


    Jetzt wird der Fehler ausgegeben:

    Code
    pi@raspberrypi:~ $ python /home/pi/LS_s.py
    Traceback (most recent call last):
    File "/home/pi/LS_s.py", line 21, in <module>
    server_socket.listen(0)
    File "/usr/lib/python2.7/socket.py", line 228, in meth
    return getattr(self._sock,name)(*args)
    socket.error: [Errno 95] Operation not supported
    Exit.
    pi@raspberrypi:~ $
  • Dann nimmste die Zeile server_socket.listen(0) raus und probierst mal bisschen selber rum

    Hatte ich gemacht, dann kam aber ein andere Fehler. Ich will dich auch nicht den ganzen Tag nerven, ist schließlich Ostern.


    Ich muß mich erstmal mehr mit den Grundlagen beschäftigen, da hapert es bei mir.


    Auf jeden Fall ganz herzlichen Dank und frohe Ostern! :danke_ATDE:

  • Hatte ich gemacht, dann kam aber ein andere Fehler. Ich will dich auch nicht den ganzen Tag nerven, ist schließlich Ostern.

    Hier sind auch noch andere - also alles gut ;)


    Ich hab den Code nicht ausprobiert, stammt aus einem python3 Script, könnte sein das es damit zu tun hat - notfalls nimmst du erst mal die betroffenen Zeilen raus solange bis es geht ;)

  • Hallo meigrafd,


    es scheint jetzt zu funktionieren, ich starte das Programm jetzt mit Crontab.


    Durch Angabe des absoluten Pfades umgeht man ggf PATH Probleme.

    Das scheint das Hauptproblem gewesen zu sein, ich habe ein Bild im Stammverzeichnis der SD Karte gefunden. Ich nahm an, das die Kamera nicht funktioniert, aber sie hat die Bilder woanders abgelegt und über Telegram wurde jeweils das Bild von /home/pi gesendet.


    Ich hab den Code nicht ausprobiert, stammt aus einem python3 Script, könnte sein das es damit zu tun hat - notfalls nimmst du erst mal die betroffenen Zeilen raus solange bis es geht

    Das schau ich mir Morgen in Ruhe an.


    Vielen Dank und frohe Ostern!