Develop and Download Open Source Software

OpenSource Downloads

7-Zip  (3,583)  
CrystalDiskInfo  (1,811)  
Tera Term  (1,787)  
HandBrake Japanese Language Version  (1,743)  
CrystalDiskMark  (980)  
FFFTP  (765)  
ffdshow  (719)  
mixfont-mplus-ipa  (615)  
MergeDoc  (571)  
10  TortoiseSVN  (555)  
11  Amateras  (437)  
12  BathyScaphe  (396)  
13  FreeMind  (372)  
14  Cabos  (327)  
15  ギコナビ  (316)  
More >>

1つのシェルから複数のSSHセッションを同時に実行するツール3種類を試す

2008年11月06日 09:23 Ben Martin 1 2 3 4

 リモートマシンへのログインやファイルのコピーなど、システム管理作業全般でSSHを利用する機会は多い。SSHでの作業を効率よく進めるには、複数のリモートマシンに対してコマンドを同時に実行できるツールを使ってみるとよいだろう。この記事では、Parallel sshCluster SSHClusterItという3つのツールを紹介する。いずれも、単一のターミナルウィンドウで入力したコマンドを、対象となる複数のリモートマシンに対して一斉に送ることができる。

 こうしたツールを使わずに、openSSHで複数ホストに対する処理を行うことも不可能ではない。たとえば、実行するコマンドを記述したファイルを作成し、bashのforループを使って、複数のリモートホストに対して順次実行していけばよい。だが、ツールを使うことにはメリットがある。その1つは、複数のホストで並行してコマンドを実行できる点だ。短時間で完了するタスクならたいした違いはないが、たとえば完了までに1時間を要するタスクを20台のホストに対して実行するとなると、順次実行するより並行処理で進める方がはるかに短時間で済むことになる。あるいは、複数のマシンで同じファイルをインタラクティブに編集するとしたら、並行処理型のSSHツールを使い、すべてのノードを対象としてviでファイルを編集する方が、同じ編集を行うスクリプトをわざわざ作るよりも短時間で済むと考えられる。

 並行処理型のSSHツールの多くには、多数のホストに対してまとめてコピーを行う機能(scpコマンドの並行処理版)や、まとめてrsyncを行う機能がある。また、対象となる全ホストを把握していることから、負荷分散を用いて、いずれかのホストで各コマンドを実行する機能を持つツールもある。さらに、「バリア」機能を持つツールもある。これは、一連のコマンド処理を複数の部分に分けておき、ある部分の処理から次の部分へ移るときには全ノードがそろって進むようにする機能だ。早く処理が完了したノードは、他の全ノードが完了するまでは次の部分へ進まず待機する。

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オプションと同様に、ログインに使用するユーザ名を指定できる。

最終更新:2009年01月06日 17:07
SourceForge.JP is a Japanese version of SourceForge.net. For developments that are not related to Japan, we recommend you to use SourceForge.net.