Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“一种方法”;管道;gnu屏幕输出到正在运行的python进程?_Python_Linux_Cherrypy_Gnu Screen - Fatal编程技术网

“一种方法”;管道;gnu屏幕输出到正在运行的python进程?

“一种方法”;管道;gnu屏幕输出到正在运行的python进程?,python,linux,cherrypy,gnu-screen,Python,Linux,Cherrypy,Gnu Screen,我正在开发一个小软件,它能够控制(启动、停止、重新启动等等——使用gnu屏幕)每一个可能的游戏服务器(有一个命令行),并包括一个小型的独立Web服务器,在linux上有一个完整的Web界面(你可以从那里访问gnu屏幕,就像你连接到它一样) 几乎所有的东西都在工作,现在需要一些代码清理 它是用python编写的,独立Web服务器使用cherrypy作为框架 问题是,webinterface上的gnu屏幕输出是通过日志文件完成的,启用时会导致高I/O(好的,这取决于运行的是什么) 有没有一种方法可以

我正在开发一个小软件,它能够控制(启动、停止、重新启动等等——使用gnu屏幕)每一个可能的游戏服务器(有一个命令行),并包括一个小型的独立Web服务器,在linux上有一个完整的Web界面(你可以从那里访问gnu屏幕,就像你连接到它一样)

几乎所有的东西都在工作,现在需要一些代码清理

它是用python编写的,独立Web服务器使用cherrypy作为框架

问题是,webinterface上的gnu屏幕输出是通过日志文件完成的,启用时会导致高I/O(好的,这取决于运行的是什么)


有没有一种方法可以将输出直接传输到独立的Web服务器(必须快速)?可能是一些带有套接字的东西,但我还不知道如何处理它们。

如果您使用
mkfifo mypipe.log
创建一个FIFO并将日志写入其中,您应该能够从python中打开它并读取。可能会有帮助。如果您还需要日志的硬拷贝,您可以通过
tee

将输出通过管道传输到管道,这样做会很危险,因为当您从管道读取数据的速度不够快时,您的命令(写入管道的命令)将被阻塞

更好的解决方案是创建一个本地“日志服务器”,在套接字上发布stdin。现在,您可以通过管道将命令的输出传输到日志服务器,该服务器从stdin读取并将输入副本发送给连接到其套接字的任何人

当无人连接时,输出将被忽略

编写这样一个“日志服务器”很简单(我想用Python大约需要1小时)

另一个优点是可以将日志文件的一部分保存在内存中(比如最后100行)。当您的命令崩溃时,您仍然可以从日志服务器获取最后的输出


要使其正常工作,在stdin返回EOF时不能终止日志服务器。缺点是您需要自己清理过时的日志服务器。当您使用套接字时,您可以从web应用程序向其发送一个“kill”命令。

您可以使用syslog,甚至可以将其配置为将所有日志发送到数据库

当你说“gnu屏幕”时,你的意思是?是的,那完全正确。当使用
屏幕时,你如何创建“日志文件”
?你是说你只是将stdout发送到日志文件和屏幕?在这种情况下,您可以通过管道将其发送到Web服务器的stdin,而不是发送到日志文件?(如果仍然需要普通标准输出,请查找tee)当前通过“screen-dmS name script-f-c'command'/some_path/logs/screen.log”(->script)完成。它应该直接通过管道传输到Web服务器,因为在坏的情况下,日志文件可能会导致高hdd I/O。没那么急,不过我想这会是个不错的选择。谢谢!我必须尝试一下,但这似乎是一个好方法:)注意,你必须一直阅读管道!如果没有,则当管道的缓冲区已满(缓冲区约为4KB)时,进程将阻塞。