如何跨(计算)节点使用 unix 管道?
Posted
技术标签:
【中文标题】如何跨(计算)节点使用 unix 管道?【英文标题】:How can I use unix piping across (compute) nodes? 【发布时间】:2013-10-02 14:56:45 【问题描述】:我正在尝试使用 unix 管道和 FIFO:s(命名管道)设置处理命令的管道。
我还想将进程的输出发送/流式传输到另一个计算节点,它可以在数据流到达后立即开始处理数据流,也就是说,我想“将标准输出通过管道传输到另一台机器”。我该怎么做?
例如是否可以设置一个 FIFO,在后台将其内容写入另一个计算节点上的 FIFO,或类似的?
【问题讨论】:
为什么不直接使用套接字库呢? netcat 和 ssh 使用 TCP/IP。您可能会从 SCTP 或 UDP 中获得更好的性能。 @BoydStephenSmithJr。我看到 netcat 也支持 UDP(只需将-u
添加到发送方和接收方),所以我想这将是最简单的选择。
【参考方案1】:
您可以使用netcat
。在这个最小的例子中,你可以使用管道将cat
的输出传递给netcat
:
cat local-filename.txt | netcat remote-hostname 1234
其中1234
表示将要使用的TCP 端口。在接收端,你可以使用:
netcat -l 1234 > filename-on-remote-host.txt
-l
表示您正在设置服务器。当原始 netcat 进程完成时,此连接将关闭。如果您需要它继续运行并等待下一次连接,您可以使用-k
选项:
netcat -kl 1234 | some-receiving-command
在任何情况下,您都可以使用缩写 nc
而不是完整的 netcat
:
nc -kl 1234 | some-receiving-command
【讨论】:
正是我想要的【参考方案2】:是的,这是可能的,只需为此目的使用ssh
。 ssh
的stdin
被发送到另一个主机。例如,您可以使用它通过 tar
将数据发送到不同的服务器:
tar cvzf - data | ssh otherhost 'cd /tmp; tar xvzf -'
【讨论】:
我猜这里主要关注的是 SSH 的性能,因为所有流量都被加密了......以上是关于如何跨(计算)节点使用 unix 管道?的主要内容,如果未能解决你的问题,请参考以下文章
Azure 机器学习在运行管道时抛出错误“无效图:节点中的计算目标无效”