2016-04-13 13 views
0

Ich werde hier total verrückt. Ich entwickle eine Website mit dem Python Flask framework und seit heute Nachmittag benimmt sich meine Linux-Box wie ein Verrückter. Lassen Sie mich erklären.Beendete Programm (Flask) sendet weiterhin Ausgabe an STDOUT?

Ich habe meine Flask-Website auf einem Ubuntu 14.04-Server. Ich verwende es normalerweise mit ./run.py Datei mit einem virtualenv. Heute habe ich einige Pakete installiert und schlussendlich beschlossen, dass ich wieder ein sauberes env möchte. So löschte ich meine venv Ordner und erstellt erneut, wie ein eine Million Mal tat vor:

$ virtualenv venv 
$ . venv/bin/activate 
(venv) $ pip install -r requirements.txt 
# EVERYTHING INSTALLS WITHOUT ERRORS 
(venv) $ ./run.py 
/home/kramer65/mysite/venv/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:100: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
    InsecurePlatformWarning 
* Running on http://0.0.0.0:5000/ 
* Restarting with inotify reloader 
* Debugger is active! 
* Debugger pin code: 219-856-383 
/home/kramer65/mysite/venv/local/lib/python2.7/site-packages/requests/packages/urllib3/util/ssl_.py:100: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning. 
    InsecurePlatformWarning 

Das ist alles ziemlich viel wie erwartet. Ich gehe dann zu meinem Browser und lade meine Website (wie ich es schon millionenfach gemacht habe). Der Browser lädt sehr lange, aber nichts wird geladen. In der Browserkonsole sehe ich überhaupt keine Verbindung.

Ich dann überprüfen Sie das Terminal und sehen nichts passiert. Also höre ich auf den Dev-Server ein STRG + C und erhalten die folgende Ausgabe mit (wie erwartet):

^CException in thread Thread-6: 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner 
    self.run() 
    File "/home/kramer65/mysite/venv/local/lib/python2.7/site-packages/watchdog/observers/inotify_buffer.py", line 59, in run 
    inotify_events = self._inotify.read_events() 
    File "/home/kramer65/mysite/venv/local/lib/python2.7/site-packages/watchdog/observers/inotify_c.py", line 296, in read_events 
    event_buffer = os.read(self._inotify_fd, event_buffer_size) 
KeyboardInterrupt 

So überprüfen ich keine Netzwerkverbindungen, die offen sind:

$ netstat -tulpn 
(Not all processes could be identified, non-owned process info 
will not be shown, you would have to be root to see it all.) 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address   Foreign Address   State  PID/Program name 
tcp  0  0 127.0.0.1:6379   0.0.0.0:*    LISTEN  - 
tcp  0  0 0.0.0.0:22    0.0.0.0:*    LISTEN  - 
tcp  0  0 0.0.0.0:5000   0.0.0.0:*    LISTEN  6127/python 
tcp  0  0 127.0.0.1:27017   0.0.0.0:*    LISTEN  - 
tcp  0  0 127.0.0.1:3306   0.0.0.0:*    LISTEN  - 
tcp6  0  0 :::22     :::*     LISTEN  - 
udp  0  0 0.0.0.0:68    0.0.0.0:*       - 
udp  0  0 0.0.0.0:24675   0.0.0.0:*       - 
udp6  0  0 :::22996    :::*        - 

So entscheide ich mich zu Töten Sie den Python-Prozess auf Port 5000 mit kill 6127. Was dann passiert, betäubt mich einfach. Der Befehl wird „akzeptiert“ (ich keinen Fehler bekommen), aber dann sehe ich der Browser plötzlich die Webseite lädt und das Terminal beginnt die Ausgabe-Protokolle:

(venv) $ kill 6127 
(venv) $ 83.161.103.21 - - [2016-04-13 13:59:44] "GET/HTTP/1.1" 200 7334 0.045281 
83.161.103.21 - - [2016-04-13 13:59:44] "GET/HTTP/1.1" 200 7334 0.062855 
83.161.103.21 - - [2016-04-13 13:59:44] "GET/HTTP/1.1" 200 7334 0.080915 
83.161.103.21 - - [2016-04-13 13:59:44] "GET/HTTP/1.1" 200 7334 0.099523 
83.161.103.21 - - [2016-04-13 13:59:44] "GET/HTTP/1.1" 200 7334 0.118382 
83.161.103.21 - - [2016-04-13 13:59:45] "GET /bower/bootstrap/dist/css/bootstrap.min.css?version=3.3.5 HTTP/1.1" 304 745 0.006047 
83.161.103.21 - - [2016-04-13 13:59:45] "GET /bower/font-awesome/css/font-awesome.min.css?version=1448904482.0 HTTP/1.1" 304 745 0.003684 
etc. etc. 

Und daraus ich verstehe nicht alles. Ich bekomme die Ausgabe, obwohl ich dachte, ich hätte den Dev-Server mit STRG + C gestoppt und zwei Befehle dazwischen ausgeführt (netstat -tulpn und kill 6127).

Ich kann dann traf ein paar Mal eingeben, die mir wieder meine Startlinie bekommt, und dann beliebige Befehle ausführen:

(venv) $ 
(venv) $ 
(venv) $ pwd 
/home/kramer65/mysite 
(venv) $ 

und wenn ich die Website im Browser neu geladen ich einfach die Ausgabe wieder in das gleiche Terminalfenster. Meine Befehle, alle Ausgaben meiner Befehle und die Flask-dev-Server-Protokolle werden nur im selben Terminal-Fenster ausgegeben.

Ich habe versucht, den Server neu zu starten, entfernen Sie alle Website-Code und entfernen und installieren Sie die virtualenv wieder, und ich habe sogar einen neuen Benutzer erstellt und alles darin installiert, aber ich bekomme das gleiche Ergebnis immer und immer wieder.

Die Sache ist, dass ich nicht weiß, WARUM ich dieses Ergebnis bekomme. Ist es wegen Flask, wegen der Virtualenv, wegen eines seltsamen Bugs mit dem Netzwerk, wegen Bash oder gar etwas anderem ?!

Und am wichtigsten, ich habe keine Ahnung, wie ich das lösen kann. Hat jemand eine Idee? Alle Tipps sind willkommen, weil ich hier meine Haare bin herausziehen ..

[EDIT]

ich $ ps -eaf | grep python lief, mit den folgenden Ergebnissen:

$ ps -eaf | grep python 
immotest 1489 1444 0 14:33 pts/1 00:00:00 venv/bin/python ./run.py 
immotest 1497 1489 1 14:33 pts/1 00:00:00 /home/kramer65/mysite/venv/bin/python ./run.py 
immohie+ 1510 1374 0 14:34 pts/0 00:00:00 grep --color=auto python 
+0

Wenn Sie eine ps -eaf | ausführen grep python zeigt es alles andere als die Ausgabe von netstat? – lapinkoira

+0

@lapinkoira - Nichts wirklich interessantes. Ich habe das Ergebnis am Ende der Frage hinzugefügt. Irgendeine Idee? – kramer65

+0

Ich müsste den run.py Code überprüfen – lapinkoira

Antwort

0

Okay, nach etwa für zu verwirren Lange habe ich das Problem gefunden.Ich vermutete schon, dass es etwas mit dem Flask-Dev-Server zu tun hatte, der einen neuen Prozess hervorbringt, um sich bei Codeänderungen neu starten zu können. In der Zwischenzeit habe ich watchdog zu der requirements.txt hinzugefügt, weil ich es benutze, um Code von meinem Laptop zu meinem Linux dev-Server zu synchronisieren.

Stellt sich heraus, dass Watchdog nicht gut mit der Verwendung von Inotify durch den Flask-dev-Server spielt. Nach dem Entfernen von Watchdog vom Server funktioniert alles wieder gut.

Ich hoffe, dass dies auch in Zukunft jemand helfen wird. Auf jeden Fall: Schönen Tag noch!

+0

Der Inotify-Reloader * ist * Watchdog und ist viel effizienter. Dies ist wahrscheinlich entweder ein separates Problem mit Ihrem Projekt oder ein Fehler, der gemeldet werden sollte, aber die Befürwortung von "Watchdog entfernen" ist definitiv keine gute Sache. – davidism

+0

@davidism - Hmm, guter Punkt. Vielleicht liegt das Problem daran, dass Sie manuell eine andere Version von Watchdog installiert haben, was Flask Probleme bereitet hat. Ich werde versuchen, das Problem in eine minimale Flask-App zu isolieren und werde es später als Problem auf der Flask github-Seite melden. – kramer65