将标准输出流直播到网页上

看起来这应该是一个很简单的事情,但不幸的是,Web开发从来不是我的强项。

我有一堆脚本,我想从网页上启动它们,并在页面上查看实时的stdout文本。其中一些脚本运行时间很长,因此正常的单个响应不够好(我已经实现了这一点)。

我所能看到的选择是:

  • 将stdout输出到文件中,并定期(每几秒钟一次)从客户端发送请求,并用此文件的内容做出响应。

  • 分块HTTP响应?我不确定它们是用来干什么的——我已经尝试过实现了,但我认为我可能误解了它们的目的。

  • Websockets(我正在使用Luvit服务器,所以这不是一个选项)。

  • ……还有其他吗?

我相信一定有一种标准的实现方式,我经常看到其他网站在做这个。例如Teamcity。或聊天室(原始TCP套接字?)。

如果有任何正确方向的指针,将不胜感激。如果最简单的方法是从客户端发送大量的定时请求,那就这样。

点赞
用户3405122
用户3405122

这让我很想起通用网关接口(Common Gateway Interfaces)

你的想法听起来都是正确的方向。由于你正在使用一个 shell 脚本,而且需要与 Web 服务器进行一些潜在的非平凡交互,我觉得指出寻找这种代码示例的地方可能是有意义的,这种方式在很久以前非常常见,而且很容易出错。

实际上,你的脚本是一个 CGI 脚本,执行着典型的任务。

在互联网早期的日子里,这是实现不是静态 HTML 文件的网页的“正常方式”。网页基本上是一个 shell 脚本(或任何从 stdin 读取并写入 stdout 的程序)实现的。

你正在做/提出的部分非常相似,我认为从旧的 CGI 代码中可以学到很有用的经验。

例如,正确处理从脚本内部通过 stdout 和通过 Web 服务器进入客户端页面的缓冲区可能会很棘手。因此,挖掘旧的示例可能会有很大帮助。

(很多东西对于你,即原始帖子的发帖者,可能都是很明显的,所以把“你”看作潜在读者。)

一般来说,棘手之处是缓冲区,我期望如此。如果你习惯于显式地处理不支持它的程序的 stdin/out 缓冲区,那么你应该能够想象到可能会发生的事情——但是如果不习惯:我记得 CGI 更糟糕,因为你还必须同步 HTTP 服务器的缓冲区(让我们希望它会自动处理)——因此也许要尽早询问问题/寻找示例。

CGI 方式将是你现在所实现的方式——如果缓冲区正确,那肯定是尽可能实时的。但是我理解你遇到了超时问题,是因为运行时间太长了吗?或者你的运行时间强烈变化?

为了让它尽可能的实时,没有什么比写 stdout 到 http 流更好的了。(我假设我们接受经过 HTTP 服务器的开销。)此外,我在考虑行缓冲,所以不是每个字符都刷新——这对用例来说足够了吗?(即没有动画进度指示器行/ ANSI 转义,你希望实时看到的)

然后也许最好的是解决超时等问题,但保持这个概念。如果实时性不是那么重要,其他方法在很多方面可能更好,当然任何可扩展性的方法都可能需要其他方法。

2014-04-23 08:21:13