DateTagsPython

Меня давно привлекали возможности Erlang'а и языков Lisp-семейства по интроспекции и горячему обновлению кода работающего приложения. И я уже давно искал инструмент, который бы позволял делать что-то подобное и для Python - и такой инструмент я наконец нашел в виде крутой обертки над gdb - Pyrasite.

Зачем он нужен? Я вижу сразу несколько кейсов:

  • Логи не всегда дают полную информацию о работе системы (иногда что-то очень важное в логах не оседает или сами логи по непонятной причине писаться перестали). Поэтому очень круто иметь возможность подключиться к приложению в интерактивном режиме и посмотреть, что вообще происходит. Не лучший вариант для продакшена, но очень хороший вариант для дебаггинга. Хотя, например, именно так отлаживали на продакшене кусок, ответственный за выгрузку из базы слепка пользователей в отдельный лог.
  • Иногда (крайне иногда) возникает необходимость произвести горячую замену кода. Это опасно, но иногда действительно необходимо. Да и в конце концов - это круто!
  • Чаще возникает необходимость заставить систему что-то принудительно сделать (но стандартных средств для этого почему-то не было реализовано) - заротировать логи, запустить сборку мусора, сбросить соединения, переподключиться к БД или что-то другое и так дожить до выкладки хотфикса.

Устанавливается достаточно тривиально с pip:

pip install pyrasite

У которых pyrasite сразу же не заводится - pytasite-shell висит и ничего не делает. Лечится все командой:

sudo echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

Пользоваться очень просто. Для интерактивного подключения достаточно сделать pyrasite-shell <pid>:

thenno@thenno-workbook:~/program/SimpleGopherServer$ pyrasite-shell 2907                                      
Pyrasite Shell 2.0
Connected to '/usr/bin/python3 ./server.py'
Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
(DistantInteractiveConsole)

На некоторых системах интерактивная консоль не работает даже после правки ptrace_scope и на них приходится работать в полуинтерактивном режиме:

  1. Написать последовательность питонячьих команд в файл.
  2. Отправить файл процессу через ptrace <pid><file>.

Так же можно проивзодить и замену кода: отправить на машинку измененные модули, а потом принудительно их переимпортировать, используя pyrasite. Можно даже все это автоматизировать, используя API. На самом деле, документация достаточно скудная, но в исходниках (кода там не так много) можно откопать подробности.

В комплекте еще идет GUI, необходимость в котором я так и не понял, и просмоторщик больших объектов в памяти процесса, который у меня не завелся.


Comments

comments powered by Disqus