已结束的程序(Flask)一直将输出发送到 STDOUT?
Ended program (Flask) keeps sending output to STDOUT?
我快要疯了。我正在使用 Python Flask framework 开发一个网站,从今天下午开始,我的 Linux 盒子就像一个疯子。让我解释一下。
我在 Ubuntu 14.04 服务器上建立了我的 Flask 网站。我通常 运行 使用 virtualenv 使用 ./run.py
文件。今天我安装了一些包,最后决定我再次想要一个干净的环境。所以我删除了我的 venv
文件夹并重新创建了它,就像之前做了一百万次一样:
$ 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
这一切都符合预期。然后我进入我的浏览器并加载我的网站(就像我之前做过一百万次一样)。浏览器加载了很长时间,但没有加载任何内容。在浏览器控制台中,我什至看不到任何连接打开。
然后我检查了终端,也没有发现任何事情发生。所以我使用 CTRL+C 停止开发服务器并获得以下输出(如预期的那样):
^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
所以我检查了所有打开的网络连接:
$ 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 :::* -
所以我决定使用 kill 6127
终止端口 5000 上的 python 进程。然后发生的事情让我震惊。该命令得到 "accepted"(我没有收到错误),但随后我看到浏览器突然加载网站并且终端开始输出日志:
(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.
从这里我什么都不懂。即使我认为我使用 CTRL+C 和 运行 之间的两个命令(netstat -tulpn
和 kill 6127
)停止了开发服务器,我仍然得到了输出。
然后我可以按回车键几次,这让我又回到了开始行,然后 运行 任意命令:
(venv) $
(venv) $
(venv) $ pwd
/home/kramer65/mysite
(venv) $
当我在浏览器中重新加载网站时,我只是在同一个终端中再次获得输出 window。我的命令、我命令的任何输出以及 Flask 开发服务器日志都在同一个终端中输出 window。
我尝试重新启动服务器,完全删除所有网站代码并再次删除和安装 virtualenv,我什至创建了一个新用户并在其中安装了所有内容,但我一遍又一遍地得到相同的结果。
问题是我不知道为什么会得到这个结果。是因为 Flask,因为 virtualenv,因为一些奇怪的网络错误,因为 bash 还是其他原因?!
最重要的是,我不知道如何解决这个问题。有人知道吗?欢迎所有提示,因为我在这里拔头发..
[编辑]
I 运行 $ ps -eaf | grep python
,结果如下:
$ 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
我已经怀疑它与 Flask 开发服务器有关,它生成一个新进程以便能够在代码更改时自行重启。我已将 watchdog 添加到 requirements.txt,因为我用它来将代码从我的笔记本电脑同步到我的 Linux 开发服务器。
Flask 开发服务器可以与 Watchdog 一起使用,但出于某种原因在这台机器上不能。从服务器中删除看门狗后一切正常。我无法通过最小的 Flask 应用程序隔离问题。
我快要疯了。我正在使用 Python Flask framework 开发一个网站,从今天下午开始,我的 Linux 盒子就像一个疯子。让我解释一下。
我在 Ubuntu 14.04 服务器上建立了我的 Flask 网站。我通常 运行 使用 virtualenv 使用 ./run.py
文件。今天我安装了一些包,最后决定我再次想要一个干净的环境。所以我删除了我的 venv
文件夹并重新创建了它,就像之前做了一百万次一样:
$ 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
这一切都符合预期。然后我进入我的浏览器并加载我的网站(就像我之前做过一百万次一样)。浏览器加载了很长时间,但没有加载任何内容。在浏览器控制台中,我什至看不到任何连接打开。
然后我检查了终端,也没有发现任何事情发生。所以我使用 CTRL+C 停止开发服务器并获得以下输出(如预期的那样):
^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
所以我检查了所有打开的网络连接:
$ 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 :::* -
所以我决定使用 kill 6127
终止端口 5000 上的 python 进程。然后发生的事情让我震惊。该命令得到 "accepted"(我没有收到错误),但随后我看到浏览器突然加载网站并且终端开始输出日志:
(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.
从这里我什么都不懂。即使我认为我使用 CTRL+C 和 运行 之间的两个命令(netstat -tulpn
和 kill 6127
)停止了开发服务器,我仍然得到了输出。
然后我可以按回车键几次,这让我又回到了开始行,然后 运行 任意命令:
(venv) $
(venv) $
(venv) $ pwd
/home/kramer65/mysite
(venv) $
当我在浏览器中重新加载网站时,我只是在同一个终端中再次获得输出 window。我的命令、我命令的任何输出以及 Flask 开发服务器日志都在同一个终端中输出 window。
我尝试重新启动服务器,完全删除所有网站代码并再次删除和安装 virtualenv,我什至创建了一个新用户并在其中安装了所有内容,但我一遍又一遍地得到相同的结果。
问题是我不知道为什么会得到这个结果。是因为 Flask,因为 virtualenv,因为一些奇怪的网络错误,因为 bash 还是其他原因?!
最重要的是,我不知道如何解决这个问题。有人知道吗?欢迎所有提示,因为我在这里拔头发..
[编辑]
I 运行 $ ps -eaf | grep python
,结果如下:
$ 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
我已经怀疑它与 Flask 开发服务器有关,它生成一个新进程以便能够在代码更改时自行重启。我已将 watchdog 添加到 requirements.txt,因为我用它来将代码从我的笔记本电脑同步到我的 Linux 开发服务器。
Flask 开发服务器可以与 Watchdog 一起使用,但出于某种原因在这台机器上不能。从服务器中删除看门狗后一切正常。我无法通过最小的 Flask 应用程序隔离问题。