以下の方法で、RemoteTarget クラスと共に run-remote コマンドを使用します。
run-remote コマンドは、常に RemoteTarget オブジェクトの配列を返します。 この配列の長さは、節で指定したリモート ターゲットの数と同じです。 配列要素は、同じ位置のリモート ターゲットにそのまま対応します。
arrRT = run-remote -file hello.js on "ascl1", "ascl2"
run-remote コマンドは、2 つの RemoteTarget オブジェクトから成る配列を返します。
RemoteTarget オブジェクトは、スクリプトの実行プロセス、出力、結果に関するステータス情報を利用可能にします。 以下の RemoteTarget メソッドを使用して、このステータス情報を取得します。
コマンドの処理が成功(true)したか失敗(false)したかを示します。 オプションの -wait スイッチを指定せずに run-remote を起動すると、コマンドは非同期で実行されます。 コマンドが完了したかどうか、および結果を利用できるどうかを確認するには、このメソッドを呼び出します。 コマンドが正常に完了した場合、メソッド hasCompleted() は true を返します。その後の処理の妨げとなるエラーが発生した場合は、false を返します。
戻り値: true または false
コマンドが正常に終了し、出力と結果を確認できる場合は false を返し、エラーが発生した場合は true を返します。
戻り値: true または false
指定されたスクリプトを対応するリモート システム上で実行し、生成された出力をキャプチャして格納した文字列を返します。
戻り値: 文字列
指定されたスクリプトを対応するリモート システム上で実行し、XML にエンコードされた値を返します。
戻り値: XML
RemoteTarget クラスのその他のメソッドについては、「AutoShell クラス」を参照してください。
例
前に紹介した「Hello World!」を出力する hello.js スクリプトで、両方の RemoteTarget オブジェクトの output() メソッドを使用してこの文字列を返すとします。 より大きな視点で見ると、以下のスクリプトはこの種の処理を行います。
var t;
var arrRT;
var i, l;
arrRT = run-remote -file hello.js on "ascl1", "ascl2"
l = arrRT.length;
// 完了を待機。上のコマンドで -wait 節を使用することもできますが、
// 以下の方法では独自にタイムアウトを設定して退出できます。
t = 0;
while(t<60)
{
for(i=0; i<l; i++)
{
if(!arrRT[i].hasCompleted())
break;
}
// 呼び出しがすべて完了したら、ループを中断
if(i==l)
break;
sleep(500);
t++;
}
for(i=0; i<l; i++)
{
if(arrRT[i].hasCompleted())
{
if(arrRT[i].errorOccurred())
{
? "次のホストでエラーが発生しました: ", arrRT[i].getHostName()
}
else
{
? arrRT[i].getHostName()," から返された出力: "
? arrRT[i].output()
}
}
else
{
arrRT[i].abort();
}
}
OS コマンドの呼び出しとリモート実行を組み合わせて使用すると、リモート システム上の OS サービスやデータにアクセスできます。 たとえば、以下のコードは、サーバ ascl1 上で稼働しているオペレーティング システムの OS バージョン文字列を問い合わせて返します。
arrRT = run-remote ! ver on "ascl1" -wait ? arrRT[0].output()
前の例では、AutoShell はリモート コマンドの出力のみを表示します。 また、リモートで処理される式やスクリプトで値を返すこともできます。
arrRT = run-remote 2*21 on "ascl1" -wait
この場合、式「2*21」がサーバ ascl1 に送信され、リモートで計算されます。 コマンドが完了すると、対応する RemoteTarget オブジェクトの result() メソッドで結果を使用できます。
result() メソッドは値を直接返すのではなく、XML 表現で値を返します。
? arrRT[0].result() <value type="number">42</value>
この XML 文字列を標準の JavaScript 値に変換するには、get-remoteResult() を使用します。
v = get-remoteResult(arrRT[0]) ? typeof v, v
また、AutoShell のシリアル化は、配列やオブジェクトなどの複雑な型を返すリモート スクリプトにも適用されます。 シリアル化により、構造データを失わずに、リモート サーバ間で大量の構造化されたデータを転送できます。 以下の例は、3 つの要素から成る配列を返すリモート実行を示しています。
arrRT = run-remote [1,"abc",new Date()] on "ascl1" -wait v = get-remoteResult(arrRT[0]) ? typeof v, v
RemoteTarget オブジェクトを使用して作業するには、実際のリモート コマンドを呼び出す前に RemoteTarget オブジェクトを作成する方法もあります。 RemoteTarget オブジェクトでは、オブジェクトを作成するときにターゲット ホストの名前を指定して構築します。
var rt1 = new RemoteTarget("ascl1");
var rt2 = new RemoteTarget("ascl2");
複数のコマンドやスクリプトを同じリモート ホスト上で実行する場合は、明示的に RemoteTarget オブジェクトを作成することをお勧めします。 こうすることで、run-remote が実行されるたびに同じ RemoteTarget オブジェクトを再利用できます。 明示的に作成しない場合、run-remote は呼び出されるたびに RemoteTarget オブジェクトを作成します。
run-remote で RemoteTarget オブジェクトを使用するには、ホスト名の代わりに RemoteTarget オブジェクトを指定します。
run-remote -file hello.js on rt1, rt2 -wait ? rt1.output() ? rt2.output() run-remote Math.log(Math.E) on rt1, rt2 ? get-remoteResult(rt1) ? get-remoteResult(rt2)
RemoteTarget オブジェクトは、run-remote から返された配列を格納しなくても使用できます。 配列には、最初にコマンドに渡した RemoteTarget オブジェクトへの参照のみが格納されます。 したがって、明示的に作成した RemoteTarget オブジェクトに直接アクセスして実行結果を問い合わせることができます。
リモート ターゲットは、前の例のようなリストや配列で指定できます。
arrRT = [new RemoteTarget("ascl1"), new RemoteTarget("ascl2")];
run-remote -file hello.js on arrRT
RemoteTarget オブジェクトは、後続の run-remote コマンド呼び出しで再利用できます。また、リモート クライアント セッションの作成を管理する方法を提供します。
AutoShell で run-remote を実行すると、指定したリモート システムに SSH を介して接続します。 デフォルトでは、リモート システム上の SSH サーバは、クライアント AutoShell の新規インスタンスを開始します。 新しく作成された AutoShell プロセスは渡されたスクリプトを評価し、評価が完了するとプロセスは破棄されます。 その後、複数のコマンドを呼び出すと、リモート システム上で複数のクライアント AutoShell プロセスが作成および破棄されます。 また、スクリプトを実行する際に作成されたコンテキスト情報はすべて失われるため、後のリモート スクリプトで利用することはできません。
RemoteTarget クラスは、リモート ホスト上でのクライアント AutoShell セッション作成を管理する、使いやすいメカニズムを実装しています。 この RemoteTarget オブジェクト用にリモート ホスト上でクライアント AutoShell の永続セッションを作成するには、RemoteTarget オブジェクトの createRemoteContext() を呼び出します。
var rt = new RemoteTarget("ascl1");
rt.createRemoteContext()
後続の run-remote 呼び出しでは、リモート ホスト上にクライアント AutoShell の一時セッションは割り当てられず、createRemoteContext() で作成した永続セッションが使用されます。 また、スクリプトを実行する際に作成されたコンテキスト情報は、後で実行されるリモート スクリプトですべて利用できます。 RemoteTarget オブジェクトを回収すると、リモート ホスト上のクライアント AutoShell の永続セッションは自動的に破棄されます。 このセッションは、対応するオブジェクトの destroyRemoteContext() を呼び出して明示的に破棄することもできます。
createRemoteContext() を使用する効果は、以下の例で簡単に確認できます。
var rt = new RemoteTarget("ascl1");
rt.createRemoteContext()
run-remote X=5 on rt -wait
run-remote X on rt -wait
? get-remoteResult(rt)
rt.destroyRemoteContext()
run-remote X=5 on rt -wait
run-remote X on rt -wait
? get-remoteResult(rt)
最初の呼び出しで作成された変数 X がクライアント AutoShell の永続セッションにまだ存在するため、2 番目のコマンド呼び出しでは 5 が返されます。 リモート クライアント セッションが破棄された、残りの 2 つの呼び出しでは、2 つの一時クライアント AutoShell の一時セッションが作成されます。 変数 X は別のセッションで作成され、すでに破棄されているため、2 番目のコマンドでは空の結果が返されます。
|
Copyright © 2013 CA.
All rights reserved.
|
|