首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可能从文件中输入pdsh?

可能从文件中输入pdsh?
EN

Unix & Linux用户
提问于 2019-09-27 13:00:00
回答 4查看 1.9K关注 0票数 1

我可以将数据从一个命令传输到另一个命令,例如:

代码语言:javascript
复制
$ echo test | cat
test

不知道该叫什么操作我可以使用以下方法获得类似的效果:

代码语言:javascript
复制
$ cat < <(echo test)
test

其中,<(echo test)是创建动态文件的基本原则。使用常规文件,如下所示:

代码语言:javascript
复制
$ cat file
test
$ cat < file
test

这同样适用于ssh:

代码语言:javascript
复制
$ ssh server cat < <(echo test)
test

使用ssh-示例作为基本示例,您可能会认为您可以这样做:

代码语言:javascript
复制
$ pdsh -a cat < <(echo test)

但是,在连接的机器上没有数据发送给cat,并且命令永远不会终止。

tee似乎能够将它在stdin上收到的信息发送到多个地方:

代码语言:javascript
复制
$ tee >(cat) >(cat) < <(echo test) 
test
test
test

是否有可能在pdsh上实现同样的目标?

EN

回答 4

Unix & Linux用户

回答已采纳

发布于 2019-09-30 18:53:56

我与一位pdsh开发人员取得了联系,并了解了以下内容:

您想要的是"stdin广播“,不幸的是,对此的支持从未添加到pdsh中。这将是一个很好的特性,但历史上并没有太多的需求,所以它从来没有做过。

似乎证实了在这个岗位上已经确立了什么。

然而,随之而来的是:

顺便说一句,这并不是说不可能进行广播。作为HPC调度器的一部分的并行启动程序可以这样做,比如srun(1)等等。其机制是一次读取stdin,然后将其复制到每个远程进程的缓冲区中,即复制在并行启动程序中完成。跟进的原因是在那个stackexchange职位上有一些误导性的答案。另一种解决串行for-循环问题的方法是从GNU并行或pdsh -R exec运行ssh。使用pdsh -R exec:$ pdsh -R exec -w主机bash -c 'ssh % host <(回显测试)‘当然,这里的缺点是创建临时文件用于重定向N次。最好将输出放入本地文件,然后将该文件放在每个ssh命令中。pdsh/并行在for循环上的好处是获得了并行性。

在我自己的测试中,我很难让这个精确的例子奏效:

代码语言:javascript
复制
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < <(echo test)'
host1: bash: -c: line 0: syntax error near unexpected token `<'
host1: bash: -c: line 0: `ssh n1 cat < <(echo test)'
pdsh@master: host1: bash exited with exit code 1

一个小的调整就会激活它,并且使用一个“普通”文件:

代码语言:javascript
复制
root@master# cat data.txt
test from file
root@master# pdsh -R exec -w host1 bash -c 'ssh %h cat < data.txt'
host1: test from file

结论:pdsh可以增加一个功能来处理我想要的更好的东西,但是即使是现在,也有实现我所要求的东西的方法。

票数 1
EN

Unix & Linux用户

发布于 2022-06-30 21:38:04

由于pdsh不支持stdin转发/广播,您可以考虑使用来自集群项目clush代替支持stdin广播的pdsh

代码语言:javascript
复制
$ clush -a cat < <(echo test)
n1c01: test
n2c01: test
n1c02: test
n2c02: test

此外,clush还具有很好的输出收集功能(例如,不需要外部管道到dshback ),如下所示:

代码语言:javascript
复制
$ clush -ab cat < <(echo test)
---------------
n[1-2]c[01-02] (4)
---------------
test

clush的标准输入绑定

票数 3
EN

Unix & Linux用户

发布于 2019-09-27 13:17:44

您需要引用远程命令,以便整个命令在远程主机上运行(S)。例如:

代码语言:javascript
复制
pdsh -a 'cat < <(echo test)'

没有引号,只有 cat在远程主机上运行。重定向(<)和过程替代 <(echo test)在本地主机上运行。

当只有一个远程主机使用echo test的输出(例如使用ssh命令)时,当有多个远程主机想要使用该输出时(例如,因为您使用的是pdsh而不是ssh),它将无法工作。

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/544052

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档