我们有几个应用服务器和一个中央监控服务器。
我们目前正在从监控服务器使用“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/