Django lässt sich nicht automatisch starten

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

Ich bin stolzer Besitzer eines Raspberry Pi Zero W.
Generell funktioniert alles, allerdings lässt sich die Weboberfläche nicht automatisch starten.
Das Script versetzt den Raspberry in einen Access Point.
Das heißt, dass ich mich mit dem Smartphone direkt auf den Raspberry verbinden kann. Ohne Router.
Der Raspberry gibt meinem Smartphone eine IP-Adresse etc...

wenn ich die unteren 3 Befehle nach dem Start des Raspberry in der shell eintrage, läuft der WebServer ohne Probleme hoch
wenn ich die Befehle an dieses Script anhänge, welches beim Systemstart gestartet wird (sonst würde der Access Point auf dem Raspberry nicht funktionieren)
kann ich keine Verbindung zum Raspberry aufbauen.
Es sieht so aus, als würden die letzten 3 Zeilen nicht ausgeführt werden.

aber warum?

Code: Alles auswählen


#!/bin/bash
# Disable Network Manager wireless

export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/host/run/dbus/system_bus_socket
dbus-send --system --print-reply --dest=org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.DBus.Properties.Set string:"org.freedesktop.NetworkManager" string:"WirelessEnabled" variant:boolean:false

# Do some cleaning up
pkill -9 dnsmasq
rfkill unblock wlan
ifdown wlan0
ifup wlan0

# Start the access point
hostapd /etc/hostapd/hostapd.conf &
dnsmasq --keep-in-foreground

#---------------------------------------------
#Bis hierher funktioniert alles!
#---------------------------------------------

sudo cd Weboberflaeche
sudo source venv/bin/activate
sudo python3 manage.py runserver 0.0.0.0:8001

__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du benutzt relative Pfade. Das Skript beim Hochstart hat aber nicht den Pfad, den du dir vorher in der Shell erreicht hast, bevor du startest.

Du musst also absoluten Pfade benuzten. Und statt dem activate würde ich einfach den vollen Pfad zum Python in dem venv benutzen.
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hat leider nicht funktioniert.
kann ich die Befehle auch in einer externen Shell ausführen lassen?
vielleicht würde es auch mehr Sinn machen, dies in einem extra Skript ausführen zu lassen?
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Mit welchem Mechanismus wird denn das Skript beim Start ausgeführt?
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Das Script liegt in einem Ordner drin.
Die Ausführung erfolgt über /etc/rc.local
Benutzeravatar
__blackjack__
User
Beiträge: 13007
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich würde mal vermuten das ``sudo`` macht keinen Sinn und ich würde die Ausgabe(n) von dem ganzen mal in eine Datei schreiben lassen, damit Du sehen kannst ob/welcher Fehler da ausgegeben wird.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Habe die Ausgaben jeweils in eine Datei schreiben lassen.
die Dateien werden zwar angelegt, aber ohne Inhalt

Code: Alles auswählen

cd Weboberflaeche > Weboberflaeche.txt
source venv/bin/activate > activate.txt
python3 manage.py runserver 0.0.0.0:8001 > Django.txt
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Ich würde auch stderr mitnehmen, z.B. "python3 manage.py runserver 0.0.0.0:8001 > Django.txt 2>&1". Fehler in dem Zusammenhang entstehen oft, weil man nicht beachtet, dass das Skript nicht in der Umgebung ausgeführt wird, in der du nach dem Anmelden an einer interaktiven Shell landest und auch unter einem anderen Benutzer; das wirkt sich z.B. auf die Verfügbarkeit von Umgebungsvariablen aus. In deinem Beispiel hast du nämlich jetzt die Vorschläge von __deets__ beide wieder missachtet :)

Persönlich würde ich auch von rc.local Abstand nehmen und alles mit systemd Units abbilden, wenn möglich. Auch die Art und Weise wie die Netzwerkinterfaces und die Services gestartet werden, ist sehr ... "rustikal". (Oder ist das eine Besonderheit des RPI Zero?).
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

`sudo` erzeugt einen neuen Prozess, so dass da ein `cd` oder `source` völlig nutzlos sind, weil der Prozess und damit die Veränderung gleich wieder zerstört wird.

Du mußt alles in eine eigenes Shell-Skript im Ordner `Weboberflaeche` schreiben, das Du dann einfach aufrufen kannst. Am besten mit sudo, absolutem Pfad und einem Nutzer, der nicht ganz so viele Rechte hat.

Code: Alles auswählen

#!/bin/bash
cd `dirname $0`
source venv/bin/activate
python3 manage.py runserver 0.0.0.0:8001
erdmulch
User
Beiträge: 230
Registriert: Samstag 17. Juli 2010, 19:50

Hallo zusammen,

hat nun doch noch geklappt.
das ganze sollte natürlich source .venv/bin/activate
anstatt source venv/bin/activate heißen.

durch die Logging Funktionion konnte ich diesen Fehler schnell finden.

vielen Dank euch
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Die Ausführung erfolgt über /etc/rc.local
Warum nutzt du nicht systemd Service Units? /etc/rc.local ist seit systemd ja der alte / veraltete Weg.

Dann könntest du z.B. deine Unit, die Django startet, in Abhängigkeit von der Unit starten, die den Raspi in den Access Point Mode versetzt. Und du bekommst das Logging über journald direkt "kostenlos" dazu.

Gruß, noisefloor
Antworten