1つのシェルから複数のSSHセッションを同時に実行するツール3種類を試すLeverage OSS(2/4 ページ)

» 2008年11月12日 00時00分 公開
[Ben Martin,SourceForge.JP Magazine]
SourceForge.JP Magazine

Parallel ssh(pssh)

 Parallel sshプロジェクトは、並行処理版のシェル(pssh)と、scp、rsync、killのそれぞれの並行処理版(pscp、prsync、pnuke)で構成されている。

 psshは、openSUSE用の1クリックインストールパッケージがあるほか、Ubuntu Hardy UniverseおよびFedora 9のリポジトリにも登録されている。わたしはFedora 9のリポジトリの64ビット版パッケージを利用した。

 Parallel sshのコマンドは「 command -h hosts-file options 」という形式で指定する。hosts-fileは、コマンドを実行する全ホストを記述したファイルだ。例えば、次の実行例の最初のpsshコマンドでは、ホストp1とp2で、dateコマンドをユーザーbenで実行する。オプションの-lは、リモート・マシンへのログインに使用するユーザー名を指定するパラメータだ。


# cat hosts-file
p1
p2
# pssh -h hosts-file -l ben date
[1] 21:12:55 [SUCCESS] p2 22
[2] 21:12:55 [SUCCESS] p1 22
# pssh -h hosts-file -l ben -P date
p2: Thu Oct 16 21:14:02 EST 2008
p2: [1] 21:13:00 [SUCCESS] p2 22
p1: Thu Sep 25 15:44:36 EST 2008
p1: [2] 21:13:00 [SUCCESS] p1 22

 通常は、リモートホストの標準出力の内容は画面に表示されない。最後の例のように-Pオプションを指定すると、リモートホストの出力と終了ステータスの両方が表示される。複雑なコマンドを実行する場合は、代わりに-iオプションを指定するとよい。そうすると各リモートホストからの出力がホスト名ごとにグループ分けして表示される。各ホストからの出力が混在する形でずらずらと表示されるより見やすいはずだ。psshでは、各リモートホストの出力内容を保存するディレクトリパスを--outdirオプションで指定することもできる。出力はホストごとに別々のファイルに保存され、リモートマシンのホスト名がファイル名として付けられる。

 --timeoutオプションでは、コマンドの完了を待機する時間を指定できる。デフォルトは60秒だ。ホスト上でコマンドの実行が60秒以内に終了しなかった場合、エラーとみなされ、その旨が次の例のように表示される。この動作で問題があるようなら、タイムアウト値を十分な長さ(例えば24時間)に設定すればよい。


# pssh -h hosts-file -l ben -i "sleep 65; date"
[1] 21:19:26 [FAILURE] p1 22 Timeout
[2] 21:19:26 [FAILURE] p2 22 (4, 'Interrupted system call')

 pscpコマンドにも、-h、-l、--timeoutの各オプションを同様に指定できる。さらに、--recursiveというオプションもある。サブディレクトリを再帰的にコピーするオプションだ。コマンドの末尾には、コピーの対象となるローカルパスとリモートパスを指定する。次の例を見てほしい。最初のpscpコマンドでは、単一のファイルを2つのリモートホストに対して同時にコピーしている。その次のsshコマンドでは、コピーしたファイルがリモートホストp1に存在することを確認している。その次のpscpコマンドはエラーになっている。長いエラーメッセージが表示されているが、これを見てもエラーの理由は不明だ。だがここでは、ディレクトリを上書きコピーしようとしたことが原因と考えられるので、--recursiveオプションを追加してコマンドを再度実行したところ、今度はうまくいった。最後のsshコマンドは、このディレクトリがリモートホストp1に存在することを確認している。


$ mkdir  example-tree
$ date > example-tree/df1.txt
$ date > example-tree/df2.txt
$ mkdir  example-tree/subdir1
$ date > example-tree/subdir1/df3.txt
$ pscp -h hosts-file -l ben example-tree/df1.txt /tmp/df1.txt
[1] 21:28:36 [SUCCESS] p1 22
[2] 21:28:36 [SUCCESS] p2 22
$ ssh p1 "cat /tmp/df1.txt"
Thu Oct 16 21:27:25 EST 2008
$ pscp -h hosts-file -l ben example-tree /tmp/example-tree
...
python: Python/ceval.c:2918: set_exc_info: Assertion `frame != ((void *)0)' failed.
Aborted
$ pscp -h hosts-file -l ben --recursive  example-tree /tmp/example-tree
[1] 21:29:57 [SUCCESS] p1 22
[2] 21:29:57 [SUCCESS] p2 22
$ ssh p1 "ls -l /tmp/example-tree"
total 24
-rw-r--r-- 1 ben ben   29 2008-09-25 16:01 df1.txt
-rw-r--r-- 1 ben ben   29 2008-09-25 16:01 df2.txt
drwxr-xr-x 2 ben ben 4096 2008-09-25 16:01 subdir1

 prsyncコマンドでは、rsyncのコマンドラインオプションの一部しか使用できない。特に、verboseオプションやdry-runオプションで詳細な処理内容を確認できない点は要注意だ。次の例では、example-treeをリモートホストの/tmp/example-treeに対しrsyncで同期している。先ほどのpscpの最後の実行例と似た形式だ。


$ prsync -h hosts-file -l ben -a --recursive  example-tree /tmp

 prsyncコマンドと同様の処理は、psshコマンドと通常のrsyncコマンドを組み合わせるやり方でも可能だが、prsyncコマンドの方が大きなメリットがある。コマンドラインが簡単である点と、ローカルマシンからリモートホストに直接同期できる点だ。psshとrsyncを組み合わせるやり方では、rsyncは各リモートホストで実行することになるので、同期のためには、リモートホストからローカルマシンへの接続が必要になる。

 pslurpは、pscpのちょうど反対のようなコマンドだ。すべてのリモートマシンからファイルやディレクトリを取得し、ローカルマシンにコピーする。次の例では、リモートマシンp1とp2からexample-treeディレクトリを取得し、/tmp/outdirに保存している。-rオプションは--recursiveの短縮形だ。この実行例から分かるように、各リモートホスト名と同じ名前のディレクトリがそれぞれ新規作成され、リモートのexample-treeディレクトリのコピーが、pslurpの最後の引数で指定したローカルディレクトリ名で作成される。


# mkdir /tmp/outdir
# pslurp -h hosts-file -L /tmp/outdir -l ben -r /tmp/example-tree example-tree
# l /tmp/outdir
drwxr-xr-x 3 root root 4.0K 2008-10-16 21:47 p1/
drwxr-xr-x 3 root root 4.0K 2008-10-16 21:47 p2/
# l /tmp/outdir/p2
drwxr-xr-x 3 root root 4.0K 2008-10-16 21:47 example-tree/
# l /tmp/outdir/p2/example-tree/
-rw-r--r-- 1 root root   29 2008-10-16 21:47 df10.txt
-rw-r--r-- 1 root root   29 2008-10-16 21:47 df1.txt
...
drwxr-xr-x 2 root root 4.0K 2008-10-16 21:47 subdir1/

 Parallel sshでは、環境変数を使って処理を簡素化することもできる。PSSH_HOSTSという変数では、-hオプションの代わりにホストファイルを指定でき、PSSH_USERという変数では、psshの-lオプションと同様に、ログインに使用するユーザー名を指定できる。

Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ