Seite 1 von 1
Bottlepy server stoppen
Verfasst: Donnerstag 24. Januar 2013, 18:14
von Ruffy
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
Re: Bottlepy server stoppen
Verfasst: Freitag 25. Januar 2013, 09:09
von kbr
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.
Re: Bottlepy server stoppen
Verfasst: Freitag 25. Januar 2013, 11:29
von noisefloor
Hallo,
du musst halt den Bottle-Prozess erst stoppen (z.B. via kill) und dann nach starten.
Gruß, noisefloor
Re: Bottlepy server stoppen
Verfasst: Samstag 26. Januar 2013, 16:59
von Defnull
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]
Re: Bottlepy server stoppen
Verfasst: Montag 28. Januar 2013, 15:04
von Ruffy
Danke werde das mit dem kill mal versuchen,
bekomm ich dann nicht das problem, dass er den prozess nicht neu startet?
Re: Bottlepy server stoppen
Verfasst: Montag 28. Januar 2013, 15:42
von Sr4l
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?
Re: Bottlepy server stoppen
Verfasst: Dienstag 29. Januar 2013, 11:50
von Ruffy
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 -.-
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
Re: Bottlepy server stoppen
Verfasst: Dienstag 29. Januar 2013, 12:05
von noisefloor
Hallo,
nur dann wenn ich es manuell aufrufe aber nicht wenn ich das script/programm aus dem bottle prozess/programm aufrufe...
??? - 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.
BTW: Wenn du "hot swapping" von Code brauchst -> Erlang kann das
Gruß, noisefloor
Re: Bottlepy server stoppen
Verfasst: Dienstag 29. Januar 2013, 12:14
von Ruffy
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
Re: Bottlepy server stoppen
Verfasst: Dienstag 29. Januar 2013, 16:00
von BlackJack
@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.
Re: Bottlepy server stoppen
Verfasst: Dienstag 29. Januar 2013, 21:10
von noisefloor
Hallo,
mit einem einfach `kill *PID*` funktioniert es auf jeden Fall. Schon vielfach "geübt"
Gruß, noisefloor
Re: Bottlepy server stoppen
Verfasst: Montag 4. Februar 2013, 14:20
von Ruffy
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 -.-