3

Java サーブレットから単純な Unix コマンドを実行したいのですが、次のようなファイルへの単純なエコー書き込みが必要です。

echo HELLO > myfile.txt

私がサーブレットでやっていることは次のとおりです。

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ServletAutorecovery extends HttpServlet {
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > ../webapps/test/myfile.txt");
            pb.start();
        } finally { 
        out.close();
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        processRequest(request, response);
    }
}

私の問題は次のとおりです。このコード セクションでエラーが発生することはありませんが、何も起こりません。サーブレットを実行した後、ファイルは作成されておらず、もちろん何も書き込まれていません。

私は何を間違っていますか?

EDIT1: pb コマンドへのフル パスを追加しました。

EDIT2:bashパス/usr/bin/bashにあり、100% 確実です。

EDIT3: SSCCE を追加しました。

4

3 に答える 3

8

まず、bash が確実に にあると確信しています/usr/binか? 次に、プロセスを実行するときに cwd として使用するディレクトリを ProcessBuilder に指示する必要があります。そうしないと、サーブレット コンテナの現在のディレクトリに myfile.txt を作成しようとします。アクセス。そして第三に、Java からプロセスを実行すると、プロセスの出力はプロセス オブジェクトの入力ストリームを介して Java に戻されます。標準出力には直接送られません。そのため、ストリームを読み取って結果を確認する必要があります。

ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", "echo HELLO > myfile.txt");
pb.directory(...);
pb.redirectErrorStream(true);
Process p = pb.start();
IOUtils.copy(p.getInputStream(), System.out);
p.waitFor();
于 2013-02-05T08:58:39.223 に答える
3
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();
于 2013-02-05T09:00:40.823 に答える
0

エラー処理を確認してください。bashinがないため、おそらくどこかで例外を飲み込んでいる可能性があり/usr/binます。そのため、「ファイルが見つかりません」という例外 (または同様のもの) が発生しています。

"/bin/bash"代わりに試してください。残りはうまくいくはずです。

また、相対パスは、アプリをデプロイした後は機能しないことに注意してください。これは、Java VM を実行しているプロセスに関連するものであり、期待、希望、または使用できるものではないためです。ServletContextでパスを尋ねるgetRealPath()

于 2013-02-05T08:53:51.320 に答える