次のように、あるコマンドから別のコマンドにデータを転送できます。
$ 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
検討できます。clush
ClusterShellプロジェクトドロップイン代替品としてpdsh
stdinブロードキャストをサポートします。
$ 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
(たとえば、コマンドを使用する場合)に機能しますが、出力を消費するリモートホストが複数ある場合(たとえば、起動の代わりに使用するため)に機能します。ssh
pdsh
ssh
答え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 1000
とwc
コマンドを置き換えます。
変更されていない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