2

ProcessBuilder を使用して、WebSphere Application Server で実行されているサーブレットから Linux サーバーでシェル スクリプトを実行しようとしています。

コードは (.waitFor() を使用して) 0 を返しますが、スクリプトは実行されていないようです。スクリプトに無効なパスを入力すると、「ファイルが見つかりません」という例外が発生するため、スクリプトを見つけていることはわかっていますが、実行されていないようです。

スクリプト自体は、最終的にzipファイルを出力する別のスクリプトを呼び出します(何かが起こっているかどうかを確認するための「タッチ」行もありますが、何もしていません)。

スクリプトは、.start() で渡しているのと同じコマンドを使用して、コマンド ラインから正常に実行されます。

ここに私のサーブレットからのスニペットがあります:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("in doPost");


    System.out.println("about to kick off ProcessBuilder");
    ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh");
    pb.redirectErrorStream(true);
    Process process = pb.start();
    BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
    int ch;
    while ((ch = br.read()) != -1)
        System.out.println((char)ch);
    br.close();
    try {
        int exitVal = process.waitFor();
        System.out.println("Exit Value: " + exitVal);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

.redirectErrorStream() と .getInputStream() は、他の人が参照しているバッファの問題に遭遇する可能性があるかどうかを確認するためのものでした (ただし、.waitFor() が 0 を返すとは思わない場合でも)。

これは ProcessBuilder への私の最初の進出なので、明らかな何かが欠けていることを願っています。

アイデア/ヒントをいただければ幸いです。

そうそう...これが私が得る出力です:

[4/5/13 21:32:41:791 PDT] 0000004d SystemOut     O in doPost
[4/5/13 21:32:41:791 PDT] 0000004d SystemOut     O about to kick off ProcessBuilder
[4/5/13 21:32:41:818 PDT] 0000004d SystemOut     O Exit Value: 0

ありがとう。

4

3 に答える 3

2

動作しました....次を使用して作業ディレクトリを設定する必要がありました。

pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/"));

したがって、最終的な解決策は次のようになります。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

System.out.println("in doPost");


System.out.println("about to kick off ProcessBuilder");
ProcessBuilder pb = new ProcessBuilder("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/test.sh");
pb.redirectErrorStream(true);
pb.directory(new File("/opt/IBM/WebSphere/AppServer/profiles/AppSrv01/installedApps/localhostNode01Cell/Svc_war.ear/Svc.war/"));
Process process = pb.start();
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
int ch;
while ((ch = br.read()) != -1)
    System.out.println((char)ch);
br.close();
try {
    int exitVal = process.waitFor();
    System.out.println("Exit Value: " + exitVal);
} catch (InterruptedException e) {
    e.printStackTrace();
}
于 2013-04-08T18:35:31.570 に答える
2

シェルスクリプトを作業ディレクトリに置くだけです。その際、 pb.directory("directory") を実行して ProcessBuilder のディレクトリを設定する必要はありません。

于 2013-08-30T18:56:49.773 に答える
0

スクリプトは、.start() で渡しているのと同じコマンドを使用して、コマンド ラインから正常に実行されます。

問題は、コマンド ラインからテストする場合、あるユーザー アカウントで実行しているのに、WebSphere が別のアカウントで実行していることです。2 つのアカウントは、異なるアクセス権、異なる$PATH設定などを持っている可能性があります。シェル スクリプトが一方のアカウントで機能するという事実は、もう一方のアカウントで機能するとは限りません。それをテストする必要があります。

于 2013-04-06T05:21:02.753 に答える