Python模拟远程tail -f?

标签 python ssh tail

我们有几个应用服务器和一个中央监控服务器。

我们目前正在从监控服务器使用“tail -f”运行 ssh,以从应用服务器实时流式传输多个文本日志文件。

除了整个方法的脆弱性之外,问题在于终止 ssh 进程有时会留下僵尸尾部进程。我们已经解决了使用 -t 创建伪终端的问题,但它有时仍然会留下僵尸进程,而且 -t 显然也在我们正在使用的作业调度产品的其他地方引起问题。

在我们能够获得适当的集中式日志记录(希望是 Logstash 和 RabbitMQ)之前,作为一个廉价而肮脏的解决方案,我希望编写一个简单的 Python 包装器,它将启动 ssh 和“tail -f”,仍然捕获输出,但将 PID 存储到磁盘上的文本文件中,以便我们稍后可以在需要时终止适当的尾进程。

我最初尝试使用 subprocess.Popen,但后来我遇到了问题,实际上实时获取“tail -f”输出(然后需要将其重定向到一个文件) - 显然会有一个主机阻塞/缓冲区问题。

一些来源似乎建议使用 pexpect、pxssh 或类似的东西。理想情况下,如果可能的话,我只想使用 Python 及其包含的库 - 但是,如果库确实是实现此目的的唯一方法,那么我对此持开放态度。

有没有一种简单的方法可以让 Python 使用“tail -f”启动 ssh,将输出实时打印到本地 STDOUT(这样我就可以重定向到本地文件),并将 PID 保存到稍后要杀死的文件?或者即使我不使用带有 tail -f 的 ssh,仍然可以(近)实时地传输远程文件的某种方式,包括将 PID 保存到文件中?

干杯, 维克多

编辑:澄清一下 - 我们希望在终止 SSH 进程时结束尾进程。

我们想从监控服务器启动 ssh 和“tail -f”,然后当我们 Ctlr-C 时,远程机器上的 tail 进程也应该结束——我们不会想让它留在后面。通常带有 -t 的 ssh 应该可以修复它,但由于我不明白的原因,它并不完全可靠,而且它不能很好地配合我们的工作安排。

因此,使用screen让另一端的进程保持存活并不是我们想要的。

最佳答案

我知道这不能回答您的问题,但是...

也许您可以尝试使用屏幕。如果您的 session 中断,您可以随时重新连接并且尾部仍将运行。它还支持多用户,因此 2 个用户可以查看同一个 tail 命令。

http://en.wikipedia.org/wiki/GNU_Screen

使用名称“log”创建:

screen -S log

断开连接:

[CTRL]+A D

重新连接

screen -r log

列出你能记住的名字

screen -list

要退出 session ,只需在 session 中键入 exit

关于Python模拟远程tail -f?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7680055/

相关文章:

unix - 环境变量中的 SSH key

bash : check if ssh key connection is well setup

node.js - Nodejs 向客户端生成远程 tail 和 socket-io

python - 为什么这个Python函数在for循环中运行时跳过索引1到3而不迭代索引2

python - 如何在笔记本小部件的选项卡上切换事件绑定(bind)

python - 用美汤写xml

python - 将 csv 输入文件打印到列/行表中

powershell - 您可以将私钥嵌入到 PowerShell WinSCP 脚本中吗?

linux - 如何从 java -version 中删除第 3 行?

linux - 如何在 tail -f 中只显示新记录的内容?