pdshをファイルからインポートできますか?

pdshをファイルからインポートできますか?

次のように、あるコマンドから別のコマンドにデータを転送できます。

$ echo test | cat
test

何を呼ぶべきか分からない。以下を使用して同様の効果を得ることができます。

$ cat < <(echo test)
test

<(echo test)即座にファイルを作成することは恥ずかしいことではありません。通常のファイルを使用すると、次のようになります。

$ cat file
test
$ cat < file
test

これはsshと同様に機能します。

$ ssh server cat < <(echo test)
test

ssh-exampleを基本として使用すると、次のようにできると考えることもできます。

$ pdsh -a cat < <(echo test)

ただし、接続されているシステムのcatにデータは送信されず、コマンドは終了しません。

tee標準入力で受け取った内容を複数の場所に送信できるようです。

$ tee >(cat) >(cat) < <(echo test) 
test
test
test

同じ目標を達成することは可能ですかpdsh

答え1

標準入力転送/ブロードキャストはサポートされていないため、使用をpdsh検討できます。clushClusterShellプロジェクトドロップイン代替品としてpdshstdinブロードキャストをサポートします。

$ clush -a cat < <(echo test)
n1c01: test
n2c01: test
n1c02: test
n2c02: test

また、次のclush優れた出力収集機能(外部パイプは不要dshback)があります。

$ clush -ab cat < <(echo test)
---------------
n[1-2]c[01-02] (4)
---------------
test

バラよりClushの標準入力バインディング

答え2

コマンド全体がリモートホストで実行されるように、リモートコマンドを引用する必要があります。例えば

pdsh -a 'cat < <(echo test)'

引用がなければ、ただcatリモートホストで実行します。リダイレクト(<)とプロセスの交換 <(echo test)ローカルホストで実行してください。

これは、出力を消費するリモートホストが1つしかない場合echo test(たとえば、コマンドを使用する場合)に機能しますが、出力を消費するリモートホストが複数ある場合(たとえば、起動の代わりに使用するため)に機能します。sshpdshssh

答え3

私は開発者の一人に連絡し、次pdshのことを知りました。

欲しいのは「stdin Broadcast」です。残念なことに、pdshはそのサポートを追加していません。これは良い機能ですが、歴史的に多くの需要がなかったので完成しませんでした。

これはこの記事ですでに確立されている内容を確認させてくれるようです。

しかし、これは次のように密接につながります。

ところで、そうではありません不可能標準入力で放送します。 srun(1) など、HPC スケジューラの一部である並列イニシエータがこれを行うことができます。メカニズムは、stdinを一度読み込み、各リモートプロセスのバッファにコピーすることです。つまり、コピーは並列実行プログラムの内部で行われます。

フォローアップを取る理由は、誤解を招く答えがあるからです。その stackexchange 投稿

シリアル for ループの問題を解決する別の方法は、GNU Parallel または pdsh -R exec で ssh を実行することです。 pdsh -R execの例:

$ pdsh -R exec -w ホスト[0-10] bash -c 'ssh %h cat < <(エコーテスト)'

もちろん、ここでの欠点は、リダイレクト用の一時ファイルをN回生成することです。おそらくより良いアプローチは、出力をローカルファイルに入れてから、そのファイルを各sshコマンドに追加することです。

forループと比較してpdsh / parallelの利点は、並列性を達成できることです。

私のテストでは、この例の動作にはいくつかの問題がありました。

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

活気を与えるための小さな調整は、「一般」ファイルを使用することです。

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私の要件をよりよく処理する機能を開発できますが、今でも私の要件を満たす方法があります。

答え4

データを複数のマシンに転送したいのは、一時ファイルに簡単に入れてリモートマシンにファイルを転送できないためだと思います。出力が連続的に生成されたり、大きすぎてディスクに収まらない可能性があります。

GNU Parallelは--tee次のことを助けることができます。

seq 1000 |
  parallel --tee --pipe ssh {} wc ::: server1 server2

seq 1000wcコマンドを置き換えます。

変更されていないGNU / Linuxシステムでは、250台のサーバーで実行する必要があります。さらに必要な場合は、ファイルハンドルが不足しているか、から、またはをulimit -n変更する必要があります。nofile/etc/security/limits.conf/proc/sys/fs/file-max

その後、次が始まります(GNU Parallelがコマンドからstdoutとstderrを収集するため、これはより複雑ですが原則は同じです)。

... | tee >(ssh server1 wc) >(ssh server2 wc) >/dev/null

したがって、パフォーマンスは同じです。ただし、これは同時に数台のサーバーではなく、すべてのサーバーが並行して動作することをtee意味します。ssh

関連情報