Законченная программа (Flask) продолжает отправлять вывод в STDOUT?
Я схожу с ума здесь. Я занимаюсь разработкой веб-сайта с использованием фреймворка Python Flask, и с этого дня мой Linux-бокс ведет себя как сумасшедший. Позволь мне объяснить.
У меня есть веб-сайт Flask на сервере Ubuntu 14.04. Я обычно запускаю его, используя ./run.py
файл с помощью virtualenv. Сегодня я установил несколько пакетов и наконец решил, что снова хочу чистый env. Поэтому я удалил свой 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
Это все в значительной степени, как и ожидалось. Затем я перехожу к своему браузеру и загружаю свой сайт (также, как я делал миллион раз раньше). Браузер загружается очень долго, но ничего не загружается. В консоли браузера я даже не вижу никакого открытия соединения вообще.
Затем я проверяю терминал и ничего не вижу. Поэтому я останавливаю dev-сервер, используя 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 :::* -
Поэтому я решил убить процесс Python на порту 5000, используя kill 6127
, То, что происходит потом, просто ошеломляет меня. Команда получает "принято" (я не получаю ошибки), но затем я вижу, что браузер внезапно загружает веб-сайт и терминал начинает выводить журналы:
(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.
И из этого я ничего не понимаю. Я получаю вывод, хотя я думал, что остановил dev-сервер с помощью CTRL+C и выполнил две команды между ними (netstat -tulpn
а также kill 6127
).
Затем я могу пару раз нажать Enter, чтобы снова получить мою стартовую строку, и затем выполнить произвольные команды:
(venv) $
(venv) $
(venv) $ pwd
/home/kramer65/mysite
(venv) $
и когда я перезагружаю сайт в браузере, я просто снова получаю вывод в том же окне терминала. Мои команды, любой вывод моих команд и журналы Dev-сервера 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
1 ответ
Я уже подозревал, что это как-то связано с сервером разработки Flask, который порождает новый процесс, чтобы иметь возможность перезапускаться при изменении кода. Я добавил сторожевой таймер в файл require.txt, потому что я использую его для синхронизации кода с моего ноутбука на моем сервере Linux-разработки.
Сервер разработчика Flask работает с Watchdog, но по какой-то причине на этом компьютере его нет. После удаления сторожевого таймера с сервера все снова работает нормально. Я не смог изолировать проблему с помощью минимального приложения Flask.