我在这里疯了。我正在使用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 -tulpn
和kill 6127
)。
然后我可以点击输入几次,这会让我再次获得我的起跑线,然后运行任意命令:
(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
答案 0 :(得分:0)
我已经怀疑它与Flask开发服务器有关,它产生了一个新进程,可以在代码更改时自行重启。我已将watchdog添加到requirements.txt,因为我使用它将我的笔记本电脑中的代码同步到我的Linux开发服务器。
Flask开发服务器与Watchdog一起使用,但出于某种原因,在这台机器上却没有。从服务器中删除看门狗后,一切正常。我无法用最小的Flask应用程序隔离问题。