如何将gnu screen输出“传递”给正在运行的python进程?

2 投票
3 回答
1558 浏览
提问于 2025-04-17 20:18

我正在开发一款小软件,它能控制所有可能的游戏服务器(只要有命令行的都可以),比如启动、停止、重启等等。这个软件还包含一个小型的独立网页服务器,带有完整的网页界面(你可以从网页上访问gnu screen,就像直接连接到它一样),运行在Linux系统上。

现在几乎所有功能都已经实现,只需要整理一下代码。

这个软件是用Python写的,独立的网页服务器使用了cherrypy这个框架。

目前遇到的问题是,网页界面上显示gnu screen的输出是通过一个日志文件来实现的,这样做会导致高的输入输出(I/O)负担(当然,这也取决于正在运行的内容)。

有没有办法能直接把输出传送到独立的网页服务器上(必须要快)?也许可以用到套接字,但我还不知道怎么处理它们。

3 个回答

0

你可以使用系统日志(syslog),或者更好的是,你可以设置它把所有的日志发送到一个数据库里!

1

往管道里写数据是可以的,但这样做有点危险,因为如果你读取数据的速度不够快,写入管道的命令就会被阻塞,无法继续执行。

一个更好的办法是创建一个本地的“日志服务器”,它可以通过一个套接字(socket)发布标准输入(stdin)的内容。这样,你就可以把命令的输出通过管道传送到这个日志服务器,日志服务器会从标准输入读取数据,并把输入的副本发送给所有连接到它的套接字的用户。

如果没有人连接到这个日志服务器,那么输出的数据就会被忽略。

写这样一个“日志服务器”其实很简单(我估计用Python大约只需要1小时)。

另外一个好处是,你可以把日志文件的一部分保存在内存中(比如最后100行)。这样,当你的命令崩溃时,你仍然可以从日志服务器获取到最后的输出。

为了让这个方案有效,你必须在标准输入返回结束符(EOF)时不要关闭日志服务器。缺点是你需要自己清理那些不再使用的日志服务器。当你使用套接字时,可以通过你的网络应用发送一个“杀死”命令来关闭它。

2

如果你用 mkfifo mypipe.log 创建了一个FIFO(先进先出队列),然后把日志写进去,你就可以在Python中打开这个FIFO并读取里面的内容。你可以查看一下这个链接 Python和FIFO,可能会对你有帮助。如果你还想要日志的硬拷贝,可以通过 tee 命令把输出同时发送到多个地方。

撰写回答