我们有几个应用服务器和一个中央监控服务器.
我们目前正在从监控服务器运行带有"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保存到文件中杀了以后?或者即使我不使用ssh with tail -f,仍然可以在(近)实时流式传输远程文件,包括将PID保存到文件中?
干杯,维克多
编辑:只是为了澄清 - 我们希望在我们终止SSH进程时尾部进程死亡.
我们想从监控服务器启动ssh和"tail -f",然后在我们Ctlr-C那时,远程盒子上的尾部进程也应该死掉 - 我们不希望它留下来.通常使用-t的ssh应该修复它,但由于我不理解的原因,它不完全可靠,并且它不能很好地与我们的作业调度一起使用.
因此,使用屏幕来保持进程的另一端不是我们想要的.
我知道这不能回答你的问题,但......
也许你可以尝试使用屏幕.如果您的会话丢失,您可以随时重新连接,尾部仍然会运行.它还支持多用户,因此2个用户可以查看相同的tail命令.
http://en.wikipedia.org/wiki/GNU_Screen
使用名称"log"创建:
screen -S log
Run Code Online (Sandbox Code Playgroud)
断开:
[CTRL]+A D
Run Code Online (Sandbox Code Playgroud)
重新安装
screen -r log
Run Code Online (Sandbox Code Playgroud)
列表,当你能记住名字
screen -list
Run Code Online (Sandbox Code Playgroud)
要摆脱会话,只需输入exit内容即可.
paramiko 模块支持通过 ssh 与 python 连接。
pysftp 有一些使用它的示例,执行命令方法可能正是您所寻找的。它将创建一个类似于您执行的命令的对象的文件。我不能说它是否为您提供实时数据。
http://code.google.com/p/pysftp/