结束程序(Flask)继续向STDOUT发送输出?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了结束程序(Flask)继续向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进程。然后发生什么只是让我震惊。该命令被“接受”(我没有得到任何错误),但后来我看到浏览器突然加载网站,终端开始输出日志:

(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停止了dev服务器并在其间运行了两个命令(netstat -tulpnkill 6127),我得到了输出。

然后我可以输入几次,这让我再次获得我的起始行,然后运行任意命令:

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

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

我尝试重新启动服务器,完全删除所有网站代码并再次删除和安装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应用程序隔离问题。

以上是关于结束程序(Flask)继续向STDOUT发送输出?的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 axios 向 Flask 应用程序发送 POST 请求

发送流终止字节以指示 TCP 流结束

用Flask-mail发送电子邮件

Cron 使用 STDERR 但不是 STDOUT 发送电子邮件?

从cron运行时,Perl脚本不会将STDOUT输出到文件

Python Flask 不向客户端发送发射