У нас есть несколько серверов приложений и центральный сервер мониторинга.
В настоящее время мы запускаем ssh с tail -f с сервера мониторинга для потоковой передачи нескольких текстовых файлов журнала в реальном времени с серверов приложений.
Проблема, помимо хрупкости всего подхода, заключается в том, что уничтожение процесса ssh может иногда оставлять позади процессы хвоста зомби. Мы обошли вокруг с помощью -t для создания псевдо-терминалов, но это все еще иногда оставляет процессы зомби, и -t, очевидно, также вызывает проблемы в других местах с продуктом планирования работы, который мы используем.
Как дешевое и грязное решение, пока мы не сможем получить правильное централизованное ведение журнала (надеюсь, Logstash и RabbitMQ), я надеюсь написать простую оболочку Python, которая будет запускать ssh и "tail -f", по-прежнему захватывая вывод, но сохраните PID в текстовый файл на диске, чтобы мы могли при необходимости завершить соответствующий хвостовой процесс позже.
Сначала я попытался использовать subprocess.Popen, но затем я столкнулся с проблемами, связанными с фактическим возвращением вывода "tail -f" в реальном времени (который затем должен быть перенаправлен в файл) - очевидно, будет хост проблем с блокировкой / буфером.
Некоторые источники рекомендовали использовать pexpect, pxssh или что-то в этом роде. В идеале я хотел бы использовать только Python и включенные в него библиотеки, если это возможно - однако, если библиотека действительно единственный способ сделать это, тогда я открыт для этого.
Есть ли хороший простой способ заставить Python запустить ssh с "tail -f", получить вывод в режиме реального времени, распечатанный здесь, на локальный STDOUT (чтобы я мог перенаправить в локальный файл), а также сохранить PID в файл убить позже? Или даже если я не использую ssh с tail -f, какой-нибудь способ потоковой передачи удаленного файла в (почти) режиме реального времени, который включает в себя сохранение PID в файл?
Ура,
Victor
РЕДАКТИРОВАТЬ: Просто чтобы уточнить - мы хотим хвостовой процесс, чтобы умереть, когда мы убиваем процесс SSH.
Мы хотим запустить ssh и "tail -f" с сервера мониторинга, а затем, когда мы запустим Ctlr-C, хвостовой процесс на удаленном блоке также должен умереть - мы не хотим это остаться позади. Обычно ssh с -t должен это исправить, но это не совсем надежно, по причинам, которые я не понимаю, и это не очень хорошо с нашим расписанием работы.
Следовательно, использование экрана для поддержания процесса на другом конце - это не то, что нам нужно.