Подтвердить что ты не робот

Может ли стрельба вызвать проблему с exscript/paramiko?

У меня есть проект Django, работающий за Nginx, и Gunicorn. Одно из приложений взаимодействует с сетевыми устройствами, использующими Exscript, который, в свою очередь, использует Paramiko. Некоторые устройства не работают должным образом, когда они находятся за Gunicorn.

Тот же самый точный код будет отлично работать в оболочке django-admin. Он также будет работать, если я запустил встроенный сервер django, но я все равно получаю ошибку, если я обхожу nginx и подключаюсь непосредственно к Gunicorn.

Я попытался переместить функциональность в задачу сельдерея, у нее была такая же точная проблема, но только за Gunicorn.

Я написал script, используя django-extensions, который работает из командной строки, но будет работать, если вызван через подпроцесс. Но только за Гуникорном.

Устройства, которые терпят неудачу, кажутся F5 LTM, и похоже, что буфер на exscript-объекте каким-то образом модифицируется. Если бы я должен был догадаться, я бы сказал, что Gunicorn и Exscript/Paramiko каким-то образом наступают на память друг друга, или, возможно, Gunicorn устанавливает некоторую переменную среды, которую Exscript набирает.

В любом случае я полностью зациклен и буду признателен за любые рекомендации по устранению этой проблемы.

4b9b3361

Ответ 1

Общая догадка, но, возможно, это будет полезно при отладке. В принципе, убедитесь, что вы удалили всю буферизацию вывода, которая часто может скрывать то, что на самом деле происходит при разбиении множества больших фреймворков (например, вы здесь).

Убедитесь, что вы отключили всю буферизацию вывода в Python, как для вашего веб-сервера переднего плана, так и для любых рабочих процессов (настройка PYTHONUNBUFFERED - это простой способ гарантировать, что ни один из ваших скриптов на питоне не буферизуется, по крайней мере, в стандартной библиотеке функции).

Терминал также может создавать буферы, которые делают отладку исключительно сложной. Рассмотрите возможность переключения your command на stdbuf -o0 -e0 your command, чтобы отключить буферы на stdout и stderr (your command может снова включить их, но большинство программ не работает).