Законченная программа (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.

Другие вопросы по тегам