Bottlepy server stoppen

Django, Flask, Bottle, WSGI, CGI…
Antworten
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

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
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
Benutzeravatar
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]
Bottle: Micro Web Framework + Development Blog
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

Danke werde das mit dem kill mal versuchen,
bekomm ich dann nicht das problem, dass er den prozess nicht neu startet?
Benutzeravatar
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?
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

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
Zuletzt geändert von Ruffy am Dienstag 29. Januar 2013, 12:10, insgesamt 1-mal geändert.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

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:

Code: Alles auswählen

kill -9 *PID*
/bin/python pythonscript.py
allerdings wird scheinbar der socket nicht freigegeben


wenn ich aber restart.sh direkt im terminal starte funktioniert alles bestens
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.
Benutzeravatar
noisefloor
User
Beiträge: 3856
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
Ruffy
User
Beiträge: 34
Registriert: Dienstag 2. Oktober 2012, 11:26

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 -.-
Antworten