- PR -

WebサービスでのRuntimeの利用について

投稿者投稿内容
koichi
会議室デビュー日: 2004/05/07
投稿数: 6
投稿日時: 2004-07-13 19:34
はじめまして、koichiです。
現在、Axis1.1を用いてWebサービスを作成しています。
C言語で作成した実行ファイルを実行させて、その処理結果を返すサービスを作っています。
下記の様なプログラムを作成し、実行ファイル(a.out)は配置先と同じ場所に置きましたが、a.outが無いよというエラーが出てしまいます。
pwdコマンドでカレントディレクトリを調べ、そのディレクトリに置くと実行できます。
任意の場所でも実行できるようにするにはどうしたらよいのでしょうか。
報告する期日に迫られ、非常に困っています。
どなたかご教授願います。

===============================================
import java.io.*;

public class RuntimeTest {
String command = "./a.out";
public String run(){
try {
Process process = Runtime.getRuntime().exec(command);
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
FileWriter fw = new FileWriter(filepath + input);
BufferedWriter bw = new BufferedWriter(fw);
String s;
while ((s = br.readLine()) != null) {
bw.write(s + "\\n");
}
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
=========================================
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-14 14:56
Webサービスとはまったく関係ない問題ですね。
プログラムを絶対パスで指定するか、プロパティファイルなり(Axisで実装しているとのことなので)
MessageContextのプロパティなりで外部からパスを渡してやればいいでしょう。
koichi
会議室デビュー日: 2004/05/07
投稿数: 6
投稿日時: 2004-07-17 19:24
レスありがとうございます。
プロパティを使ったことがないのでネットで調べても利用方法がよく分かりません。
サンプルプログラムや参考になるページ等をご存じないでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-18 13:40
引用:

koichiさんの書き込み (2004-07-17 19:24) より:
レスありがとうございます。
プロパティを使ったことがないのでネットで調べても利用方法がよく分かりません。
サンプルプログラムや参考になるページ等をご存じないでしょうか。


Axisのプロパティのことと理解して回答します。まず、プロパティの設定の仕方ですが、
Axisのserver-config.wsddに設定します。設定の方法は、
http://ws.apache.org/~toshi/jp-site/axis/java/user-guide.html
の「カスタムデプロイ」のあたりを参照してください。中身は、

<service name="xxx" provider="java:RPC">
<parameter name="className" value="xxx.xxx"/>
<parameter name="allowedMethods" value="*"/>
<parameter name="commandPath" value="/usr/local/test"/>
</service>

こんな感じになるでしょう。

次に取得の方法ですが、以下のようになります。
MessageContext context = MessageContext.getCurrentContext();
String path = context.getProperty("commandPath");
koichi
会議室デビュー日: 2004/05/07
投稿数: 6
投稿日時: 2004-07-18 16:58
レスありがとうございます。
早速、deploy.wsddに下記の行を追加し、
<parameter name="commandPath" value="/usr/local/test"/>

サービス側のプログラムに以下の行を追加して正しく動作しているか確認しました。
MessageContext context = MessageContext.getCurrentContext();
String path = context.getProperty("commandPath");

pathの値を表示すると /usr/local/test のように出力されるのですが、
/usr/local/test内に置いた実行ファイルが実行されません。
以下の様に、サービスプログラムでpwdコマンドを呼び出し、その値を見ると
違う場所が表示されます。
Process process = Runtime.getRuntime().exec("pwd");

これはAxisのプロパティで設定するのではないということでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-18 17:54
String path = context.getProperty("commandPath");

pathの値を表示すると /usr/local/test のように出力されるのですが、
/usr/local/test内に置いた実行ファイルが実行されません。
以下の様に、サービスプログラムでpwdコマンドを呼び出し、その値を見ると
違う場所が表示されます。
Process process = Runtime.getRuntime().exec("pwd");

これはAxisのプロパティで設定するのではないということでしょうか。

[/quote]
カレントディレクトリを指定してやる、という意味ではありません。実行プログラムのパスを
外部から設定してやる、ということです。

元のプログラムでは、
String command = "./a.out";
と実行プログラムのパスがカレントディレクトリに設定されているので、その代わりに

String path = context.getProperty("commandPath");
String command = path + "/a.out";

のように絶対パスで指定してやればよい、ということです。
koichi
会議室デビュー日: 2004/05/07
投稿数: 6
投稿日時: 2004-07-19 16:05
丁寧に説明していただいてありがとうございます。
適切に実行することができました。

さらに質問させていただいて宜しいでしょうか。
カレントディレクトリを指定するには、どうすればよいのでしょうか。
というのも現在、クライアントごとに実行プログラムに引数として、パラメータ等が記述された設定ファイルを読み込ませたいと思っております。

今、クライアント用のマシンとサービスを提供するサーバの2台で作成しています。
サーバ側の/home/koichi/web内でプログラムを作成し,
クラスファイルを/home/koichi/app/tomcat/webapps/axis/WEB-INF/classes/webに配置しています。
そして、クライアント用のマシンでクライアントプログラムを作成し、サービスを利用しています。
サービスプログラム内で
Process process = Runtime.getRuntime().exec("pwd");
と記述して、カレントディレクトリの位置を見ていると、
/home/koichi/app/tomcat/bin/startup.sh
を実行した場所をカレントディレクトリとすることが分かりました。
そこに設定ファイルを置いて実行すると適切に実行することが確認できました。

この情報は、一体どのファイルに記述されるものなのでしょうか。
また、そのカレントディレクトリをクライアントごとに変更できるようなAPIは提供されているのでしょうか。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-07-19 18:31
引用:

koichiさんの書き込み (2004-07-19 16:05) より:
カレントディレクトリを指定するには、どうすればよいのでしょうか。
というのも現在、クライアントごとに実行プログラムに引数として、パラメータ等が記述された設定ファイルを読み込ませたいと思っております。


Webアプリケーションで、(暗黙の)カレントディレクトリを使うのはやめたほうがいいでしょう。

引用:

この情報は、一体どのファイルに記述されるものなのでしょうか。


単純にカレントディレクトリを確認するのであれば、System.getProperty("user.dir")で
取得できます。

引用:

また、そのカレントディレクトリをクライアントごとに変更できるようなAPIは提供されているのでしょうか。


実行されるサーバプロセスは一つなので、「クライアント」ごとというのはありえないですね。
より確実なのは、実行プログラム(この場合はa.out)の引数としてパスを渡してやることです。
またはシェルスクリプトを一つ噛ませて、シェルスクリプト内で実行プログラムのあるディレクトリに
移動してから実行するとかですかね。どちらにしても、「明示的に」渡すほうが確実です。

スキルアップ/キャリアアップ(JOB@IT)