Webserver lässt sich nicht über crontab starten

  • Raspberry Pi 1, aktuellstes Raspbian Stretch

    Moin,

    Ich habe mir über die python-library nach Anleitung einen sehr simplen Server erstellt, über den ich ein Relais öffnen und schließen kann:

    Das funktioniert soweit ohne Probleme. Allerdings schaffe ich es einfach nicht, den über crontab beim boot zu starten. Folgendes habe ich versucht:

    Damit das user directory richtig ist habe ich ein sh-script erstellt, das von crontab geöffnet werden soll:

    relais_boot.sh

    Bash
    #!/bin/sh -
    
    cd /
    cd home/pi/relais
    sudo python3 relais.py

    Wenn ich das Script von Hand öffne startet der Server ganz normal. Wenn crontab allerdings das Script beim Boot öffnet bekomme ich folgende Fehlermeldung:

    Code
    Traceback (most recent call last):
      File "klingelserver.py", line 72, in <module>
        http_server = HTTPServer((host_name, host_port), MyServer)
      File "/usr/lib/python3.5/socketserver.py", line 440, in __init__
        self.server_bind()
      File "/usr/lib/python3.5/http/server.py", line 138, in server_bind
        socketserver.TCPServer.server_bind(self)
      File "/usr/lib/python3.5/socketserver.py", line 454, in server_bind
        self.socket.bind(self.server_address)
    OSError: [Errno 99] Cannot assign requested address

    Weiß jemand warum? Braucht crontab irgendeine besondere Berechtigung?

    Vielen Dank

    6 Mal editiert, zuletzt von Dev (21. Juni 2018 um 23:39)

  • Hallo,

    Dev: hast du einen konkreten Grund, warum du das low-level selber schreibst statt ein Framework wie Bottle oder Flask zu nehmen? Damit schreibst du a) deutlich weniger Code und hast b) sehr sicher ein deutlich besser getestetes und robusteres Handling von POST / Formulardaten. Außerdem sind deine Dateien, die im oder unterhalb des Startverzeichnisses des Servers liegen nicht herunterladbar.

    Außerdem solltest du noch ein GPIO.cleanup() einbauen, wenn der Server beendet wird.

    Gruß, noisefloor

  • Ich hatte dasselbe Problem, und hab den Pythonscript dann ganz am Ende im RC.LOCAL gestartet, und dann gings.

    Das ist aber auch nur mit gut Glück, da nicht garantiert wird, dass das Netzwerk zu dem Zeitpunkt bereit ist. ein sleep n ist auch eher schlecht als recht. Also Vorsicht mit solchen Tipps...

    Systemd ist IMHO auf einem normalen Raspbian "the way to go".

  • Also ich habe nun folgende systemd-datei erstellt und konfiguriert:

    klingel.service:

    Code
    [Unit]
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    ExecStart=/home/pi/klingel/klingel_boot.sh
    
    [Install]
    WantedBy=default.target

    Ich habe sogar noch einen until [ping]-Befehl in das Bash-Script gesetzt. Wenn ich systemctl status klingel.service eingebe, trotzdem der gleiche Fehler: "Cannot assign requested address". Auch hier wieder: wenn ich den daemon manuell starte funktioniert er.

    noisefloor:

    Stimmt, GPIO.cleanup() baue ich ein, danke für den Hinweis!

    Per Framework wäre das ganze sicherlich eleganter, aber ich wollte es innerhalb kürzester Zeit ohne Zusatzprogramme implementieren und mein Server muss wirklich nur zwei Post-Befehle verarbeiten.

  • Hallo,

    bist du sicher, dass a) die IP-Adresse des Pi die richtige ist und b) der Post nicht durch ein anderes Programm belegt ist?

    Die IP ist richtig, der Server startet ja ganz normal wenn ich ihn nach dem Bootvorgang manuell starte.

    Wodurch könnte der Post denn belegt sein? Hab ein frisches Radpbian drauf und nichts was sonst auf den Server zugreift. Und der Fehler kommt ja auch schon beim Starten des Servers.

    Zitat

    wieso startest du darin ein Shell-Skript, wenn wir hier von einem Python-Skript reden?

    Ist noch ein Überbleibsel von crontab. Damit ich den Pfad ändern kann aus de crontab das Script öffnet. Werde ich löschen sobald es funktioniert.

  • python- und bash-script sind beide im ersten Beitrag zu sehen. Das Bash-Script ist ausführbar und funktioniert manuell ausgeführt ohne Probleme. Nur nicht automatisch nach Systemstart.

    Sehe gerade, dass in der python-Datei der Shebang fehlt. Werde ich noch hinzufügen wenn ich wieder am Pi bin, aber wird ja nichts ändern denke ich.

  • Der Shebang, der derzeit zu sehen ist, ist definitiv falsch. Da bekomme ich

    Code
    /bin/sh: 0: Illegal option -#
    Bash
    $ cat test.sh
    #!/bin/sh -#!/bin/sh -
    echo test
    $ chmod +x test.sh
    $ ./test.sh
    /bin/sh: 0: Illegal option -#
    $

    Edit: warum vertraust du die ganze Zeit auf nicht vorhandene oder falsche Shebangs und korrekte Dateirechte, anstatt einfach den absoluten Pfad zum Shell-Script (besser direkt Python) einer Shell als Argument zu übergeben?

    z.B.

    Code
    /bin/sh /path/to/script.sh
  • Okay, ich höre besser auf hier am Handy aus meinem Gedächtnis irgendwelche Dinge falsch zu editieren und melde mich wieder wenn ich den Pi zur Hand habe :-/

    /edit: So, hatte im Beitrag den Shebang wohl doppelt reinkopiert. Jetzt sind die Shebangs so wie sie auch in meinen Dateien sind. Fehler immer noch derselbe.

    Einmal editiert, zuletzt von Dev (18. Juni 2018 um 21:37)

  • Also, es muss auf jeden Fall daran liegen, dass das Netzwerk noch nicht da ist. Wenn ich im python-Script am Anfang 15 Sekunden warte dann funktioniert es.

    Also scheint network-online.target nicht hinreichend zu sein. Kann ich die Service-Unit irgendwie so anpassen, dass er lange genug wartet?

    • Offizieller Beitrag

    Hallo,

    der Shebang in der *.sh ist noch falsch (Bindestrich raus).

    Warum per cd und nicht der direkte Pfad home/pi/relais/relais.py?

    Habe ich den Cronjob übersehen oder willst Du es nun mit systemd versuchen?

    Hast Du die Netzwerkgeschichte schon über sudo raspi-config => Boot Options => Wait for Network at Boot versucht zu lösen?

    Und warum hast Du den Beitrag mit den Infos über die Shebangs gelöscht? :conf:

  • Hallo,

    der Shebang in der *.sh ist noch falsch (Bindestrich raus).

    Ok danke. Die *.sh ist nun eh wieder gelöscht, da ich sie ja ohne crontab nicht mehr brauche.

    Zitat

    Hast Du die Netzwerkgeschichte schon über sudo raspi-config => Boot Options => Wait for Network at Boot versucht zu lösen?

    Damit funktioniert es. Allerdings braucht der Bootvorgang dann halt ewig. Der Pi läuft ohne Bildschirm, weshalb ich nicht überprüfen kann ob der Bootvorgang abgeschlossen ist oder nicht. Deshalb würde ich das ganze lieber in der Service-Unit lösen.

    Zitat

    Und warum hast Du den Beitrag mit den Infos über die Shebangs gelöscht?

    Habe 2 Beiträge zu einem zusammengefasst, für die Übersicht.

    Einmal editiert, zuletzt von Dev (18. Juni 2018 um 23:21)

Jetzt mitmachen!

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