Python для эмуляции удаленного tail -f?

У нас есть несколько серверов приложений и центральный сервер мониторинга.

В настоящее время мы используем ssh с "tail -f" с сервера мониторинга для потоковой передачи нескольких текстовых журналов в реальном времени с серверов приложений.

Проблема, помимо хрупкости всего подхода, заключается в том, что уничтожение процесса ssh иногда оставляет после себя зомби-процессы tail. Мы попробовали использовать -t для создания псевдотерминалов, но это все равно иногда оставляет зомби-процессы, и -t, очевидно, также вызывает проблемы с используемым нами продуктом планирования заданий.

В качестве дешевого и грязного решения, пока мы не сможем получить надлежащую централизованную регистрацию (Logstash и RabbitMQ, надеюсь), я надеюсь написать простую обертку на Python, которая будет запускать ssh и "tail -f", по-прежнему захватывать вывод, но сохранять PID в текстовый файл на диске, чтобы мы могли убить соответствующий процесс tail позже, если потребуется.

Сначала я пытался использовать subprocess.Popen, но потом столкнулся с проблемами с получением вывода "tail -f" в реальном времени (который затем нужно перенаправить в файл) - очевидно, что возникнет множество проблем с блокировкой/буфером.

Несколько источников рекомендуют использовать pexpect, или pxssh, или что-то подобное. В идеале я хотел бы использовать только Python и прилагаемые библиотеки, если это возможно - однако, если библиотека действительно единственный способ сделать это, то я не против.

Есть ли хороший простой способ заставить Python запустить ssh с "tail -f", получить вывод в реальном времени, напечатанный на локальный STDOUT здесь (чтобы я мог перенаправить в локальный файл), а также сохранить PID в файл, чтобы убить позже? Или, даже если я не использую ssh с tail -f, есть ли какой-то способ потоковой передачи удаленного файла в (почти) реальном времени, который включает сохранение PID в файл?

Будьте здоровы, Виктор

EDIT: Просто чтобы уточнить - мы хотим, чтобы процесс tail умирал, когда мы убиваем процесс SSH.

Мы хотим запустить ssh и "tail -f" с сервера мониторинга, затем, когда мы Ctlr-C это, процесс tail на удаленном боксе должен умереть также - мы не хотим, чтобы он оставался позади. Обычно ssh с -t должен исправить это, но он не совсем надежен, по непонятным мне причинам, и не очень хорошо сочетается с нашим планированием работы.

Следовательно, использование screen для поддержания процесса на другом конце - это не то, чего мы хотим.

9
задан victorhooi 7 October 2011 в 03:34
поделиться