python - 已结束的程序(Flask)一直将输出发送到 STDOUT?

标签 python linux bash flask sigint

我在这里完全疯了。我正在使用 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 进程。然后发生的事情让我震惊。命令被“接受”(我没有收到任何错误),但随后我看到浏览器突然加载网站并且终端开始输出日志:

(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 -tulpnkill 6127)。

然后我可以按几次 Enter 键,这让我又回到了开始行,然后运行任意命令:

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

当我在浏览器中重新加载网站时,我只是在同一个终端窗口中再次获得输出。我的命令、我命令的任何输出以及 Flask 开发服务器日志都在同一个终端窗口中输出。

我尝试重新启动服务器,完全删除所有网站代码并再次删除和安装 virtualenv,我什至创建了一个新用户并在其中安装了所有内容,但我一遍又一遍地得到相同的结果。

问题是我不知道为什么会得到这个结果。是因为 Flask,因为 virtualenv,因为一些奇怪的网络错误,因为 bash 还是其他原因?!

最重要的是,我不知道如何解决这个问题。有人知道吗?欢迎所有提示,因为我在这里拔头发..

[编辑]

我运行了$ 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)一直将输出发送到 STDOUT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36601254/

相关文章:

python - 更改图表图例颜色,构建自己的图表配色方案 - Openpyxl 2.4.9

linux - Curl 返回 ststus 6(DNS 名称错误地址错误)

python - 我的 Django 项目是否消耗了异常数量的 RAM?

windows - 在 Windows 上运行 bash 脚本时,Git Bash 与 Slash '/' 混淆

c++ - 如何检测 MIME 文件中的纯文本?

python - ${PYTHON :-python} in shell script and how to change 的含义

python - 有人能给我一些关于程序格式和效率的建议吗?

python - 如何检查 Item() 中的值是否为空?

python - 在Python中的对象初始化中将self传递给函数

linux - 在 bash 中获取图像的大小