簡體   English   中英

來自java的bash unix processbuilder沒有運行

[英]bash unix processbuilder from java not running

我想從我的Java servlet執行一個簡單的Unix命令:我需要做的是對這個文件進行簡單的echo寫入:

echo HELLO > myfile.txt

我在servlet中做的是:

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);
    }
}

我的問題是:這段代碼部分沒有給我任何錯誤,但沒有任何反應。 在我執行我的servlet之后,文件還沒有被創建,當然,沒有寫入任何內容。

我究竟做錯了什么?

EDIT1:添加了pb命令的完整路徑。

EDIT2: bash在路徑/usr/bin/bash ,100%肯定它。

EDIT3:添加了SSCCE。

首先,你確定bash肯定在/usr/bin嗎? 其次,你可能需要告訴ProcessBuilder在運行進程時它應該用作cwd的目錄,否則它會嘗試在servlet容器的當前目錄中創建myfile.txt,通常是你沒有寫的地方訪問。 第三,當你從java運行一個進程時,進程的輸出通過進程對象上的輸入流傳遞回java,它不會直接進入stdout,所以你需要讀取流來查看結果

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();
String echo = "echo 'hello' > myfile.txt";
ProcessBuilder pb = new ProcessBuilder("/usr/bin/bash", "-c", echo);
pb.start();

檢查你的錯誤處理; 你可能在某個地方吞下一個異常,因為/usr/bin沒有bash ,所以你得到一個“找不到文件”的異常(或者類似的)。

請嘗試"/bin/bash" 其余的應該工作。

另請注意,部署應用程序后,相對路徑將不起作用,因為它將與運行Java VM的進程相關,而不是您期望,想要或可能使用的進程。 ServletContext詢問getRealPath()的路徑

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM