将无限流传输到内部循环?

将无限流传输到内部循环?

我已经看到很多关于将标准输出重定向到 TCP 套接字的内容,但没有实际示例说明如何在实践中做到这一点,特别是当第一个“命令”生成的输出流永不结束时。

要讨论一些具体的事情,让我们以服务器之类的程序为例,它们通常会无休止地将日志输出到 stdout(当然,只要它们运行)。如果您将输出重定向到磁盘上的日志文件,则此文件始终处于打开状态(因此其他人无法读取?)并且会无限增长,最终会导致问题。

这可能是一个很好的问题,但我不知道它做什么或如何做到这一点。

  1. 如何将命令的输出重定向至内部循环?
  2. 我想确保每次将内容写入 stdout 时都会发送数据,并且管道不会等待命令结束(理想情况下永远不会发生!)。对吗?
  3. 如果 2 为真,那么是否存在缓冲系统,仅在数据达到一定大小时才发送数据块?
  4. 您能给我提供执行上述操作的具体命令行示例吗?

提前致谢

答案1

使用 netcat

  1. 安装netcat-传统安装 netcat-traditional或者netcat-openbsd安装 netcat-openbsd
  2. 在接收端,打开一个监听套接字:

    nc -l 1234
    

    其中1234是要监听的端口号。默认情况下,netcat 使用 TCP 套接字。它将持续运行,直到收到 EOF。如果您需要关闭它,请添加选项-q -1(负等待超时 - 请参阅手册页)。

    (可选)将输出重定向到文件或通过管道传输,例如:

    nc -l 1234 > mylogfile.log
    
  3. 在发送端,启动命令并将标准输出传送到 netcat:

    mycommand | nc 123.45.67.89 1234
    

    其中,123.45.67.89是监听端的IP地址,1234是端口号。

    这将连续运行(流式传输数据)直到mycommand输出 EOF。


讨论

如何将命令的输出重定向至内部循环?

我不确定你所说的“内部循环”是什么意思,但重定向输出对于你的 shell 来说是一个非常普遍的问题。

我想确保每次将内容写入 stdout 时都会发送数据,并且管道不会等待命令结束(理想情况下永远不会发生!)。对吗?

据我所知,shell 中的管道不会等待 EOF 来传递数据。

如果 2 为真,那么是否存在缓冲系统,仅在数据达到一定大小时才发送数据块?

是的,管道中的一般缓冲区如 ignis 的建议中所述他的评论关于 UL 的问题:关闭管道中的缓冲

TCP 将在 TCP 级别处理缓冲区。

相关内容