Hi,
ich wollte mal fragen ob jemand weiß obs ne möglichkeit gibt bottlepy auch wieder zu stoppen.
Ich hab das ganze in nem Daemon ausgeführt und würde gerne eine restart funktion im webfrontend einbauen,
wenn ich allerdings mit os.execv das script mit dem restart parameter aufrufe, crashed das ganze da bottlepy irgendwie immer noch den port belegt.
sobald ich den port beim restart ändere, gehts wieder 1a. Wundert mich allerdings schon etwas, da der "normale" restart über python myscript.py restart wunderbar funktioniert.
gibts ne möglichkeit bottlepy quasi runterzufahren?
EDIT: ich benutze den standart WSGIRefServer von bottlepy
Bottlepy server stoppen
Das Problem liegt m.e. nicht im runterfahren, sondern im hochfahren von bottle. Bzw. es liegt daran, dass der WSGIRefServer von bottlepy auf dem SocketServer der Standard-Library basiert und dort die Socket-Option 'SO_REUSEPORT' nicht gesetzt wird. Das Problem wirst Du vermutlich ohne patchen des WSGIRefServer nicht lösen können - aber ich kenne mich mit bottle nicht sonderlich gut aus. Möglicherweise hilft es wenn Du einen anderen ServerAdapter verwendest, der dieses Problem umgeht.
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
du musst halt den Bottle-Prozess erst stoppen (z.B. via kill) und dann nach starten.
Gruß, noisefloor
du musst halt den Bottle-Prozess erst stoppen (z.B. via kill) und dann nach starten.
Gruß, noisefloor
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Bottle fährt bei einem SIGINT (das Signal, das auch von Ctrl-c geschickt wird und einen KeyboardInterrupt auslöst) sauber runter.
kill -INT [pid vom bottle prozess]
kill -INT [pid vom bottle prozess]
Bottle: Micro Web Framework + Development Blog
- Sr4l
- User
- Beiträge: 1091
- Registriert: Donnerstag 28. Dezember 2006, 20:02
- Wohnort: Kassel
- Kontaktdaten:
Du kannst nur ein andere Programm aufrufen welches den gewünschten Bottle Prozess beendet und dann neun wieder startet und sich dann selber beendet.
Ich finde die eigentliche Frage ist: Warum willst du den Server aus dem Webfrontend neustarten?
Ich finde die eigentliche Frage ist: Warum willst du den Server aus dem Webfrontend neustarten?
Ich möchte den neu starten weils ne update funktion gibt und er soll nach dem update neu starten. das geht nicht direkt übers webinterface sondern das webinterface sendet eigentlich nur den update befehl an den apsheduler welcher dann das update ausführt und nach erfolgreichem update neustarten soll.
Ich habs mal mit nem bash skript versucht das den bottle prozess killt und dann neu startet, hat aber leider auch nicht funktioniert... nur dann wenn ich es manuell aufrufe aber nicht wenn ich das script/programm aus dem bottle prozess/programm aufrufe...
Es sieht irgendwie so aus dass der socket nicht wieder frei gegeben wird beim killen des prozesses -.-
Ich habs mal mit nem bash skript versucht das den bottle prozess killt und dann neu startet, hat aber leider auch nicht funktioniert... nur dann wenn ich es manuell aufrufe aber nicht wenn ich das script/programm aus dem bottle prozess/programm aufrufe...
Es sieht irgendwie so aus dass der socket nicht wieder frei gegeben wird beim killen des prozesses -.-
Code: Alles auswählen
web.run(host='0.0.0.0', port=1336, debug=True)
File "/Users/workstation/Documents/github/SynoDLNAtrakt/lib/bottle.py", line 2697, in run
server.run(app)
File "/Users/workstation/Documents/github/SynoDLNAtrakt/lib/bottle.py", line 2379, in run
srv = make_server(self.host, self.port, handler, **self.options)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/simple_server.py", line 144, in make_server
server = server_class((host, port), handler_class)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 408, in __init__
self.server_bind()
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/wsgiref/simple_server.py", line 48, in server_bind
HTTPServer.server_bind(self)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/BaseHTTPServer.py", line 108, in server_bind
SocketServer.TCPServer.server_bind(self)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/SocketServer.py", line 419, in server_bind
self.socket.bind(self.server_address)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 48] Address already in use
Zuletzt geändert von Ruffy am Dienstag 29. Januar 2013, 12:10, insgesamt 1-mal geändert.
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
BTW: Wenn du "hot swapping" von Code brauchst -> Erlang kann das
Gruß, noisefloor
??? - es soll doch auch von extern kommen. Ansonsten funktioniert das doch auf keinen Fall! D.h. du brauchst auf jeden Fall einen externen Prozess (entweder einen echten, ein Shellskript oder auch eine manuelle Eingabe), die das erledigt.nur dann wenn ich es manuell aufrufe aber nicht wenn ich das script/programm aus dem bottle prozess/programm aufrufe...
BTW: Wenn du "hot swapping" von Code brauchst -> Erlang kann das

Gruß, noisefloor
ja mir ist schon klar dass ich nen 2ten prozess dazu brauche...
ich hab das so gemacht:
python web interface:
subprocess.Popen(['/bin/sh', 'restart.sh'])
restart.sh:
allerdings wird scheinbar der socket nicht freigegeben
wenn ich aber restart.sh direkt im terminal starte funktioniert alles bestens
ich hab das so gemacht:
python web interface:
subprocess.Popen(['/bin/sh', 'restart.sh'])
restart.sh:
Code: Alles auswählen
kill -9 *PID*
/bin/python pythonscript.py
wenn ich aber restart.sh direkt im terminal starte funktioniert alles bestens
@Ruffy: Da der Server das beim beenden macht ist ja auch klar dass das bei ``kill -9`` nicht funktionieren kann, weil damit der Server nicht ordentlich beendet sondern brutal vom Betriebssystem abgewürgt wird.
- noisefloor
- User
- Beiträge: 4149
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
mit einem einfach `kill *PID*` funktioniert es auf jeden Fall. Schon vielfach "geübt"
Gruß, noisefloor
mit einem einfach `kill *PID*` funktioniert es auf jeden Fall. Schon vielfach "geübt"

Gruß, noisefloor
Hi, erst mal danke für die ganzen antworten, leider funktioniert kill *PID* auch nicht, war wird der process beendet und ich bekomme auch ein "terminated" im terminal angezeigt, aber beim erneuten start bekomme ich immer noch den Address already in use fehler.
komischerweise aber nur wenn ich das bash script aus dem python script heraus aufrufe. wenn ichs direkt im terminal aufrufe geht alles -.-
komischerweise aber nur wenn ich das bash script aus dem python script heraus aufrufe. wenn ichs direkt im terminal aufrufe geht alles -.-