2012-01-05 1 views
3

사용자 입력을 요청하고 그 입력을 서버 측 컴퓨터의 외부 프로그램의 명령 줄 인수로 전달하는 작은 웹 응용 프로그램을 개발 중입니다.Java 서블릿에서 외부 명령을 어떻게 실행합니까?

public class WorkflowServlet extends HttpServlet 

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String username = request.getParameter("username"); 
    String workflow = request.getParameter("workflow"); 
    String preInflation = request.getParamater("preInflation"); 
    String email = request.getParamater("email"); 

    try { 
     executeShellCommand("java ClusterProcess " + username + " " 
          + workflow + " " + preInflation + " " + email); 
    } catch (Exception e) { 
     response.sendRedirect("WorkflowAction.jsp"); return; 
    } 

     response.sendRedirect("WorkflowInProgress.jsp"); 
    } 
    } 


    public static void executeShellCommand(String command) { 
     Runtime.getRuntime().exec(command.split(" ")).waitFor(); 
    } 
} 

아무런 예외도 발생하지 않습니다. 아무 것도하지 않는 것 같습니다. ShellCommmand를 실행하기 위해 "touch test.txt"와 같이 간단하게 전달하더라도 아무 일도하지 않습니다. 명령 줄을 통해 수동으로 명령을 성공적으로 실행할 수 있습니다.

어떻게해야합니까?

+0

왜 "분할"? – davogotland

+0

또한 왜 waitFor에서 반환 된 값을 사용하지 않습니까? 그것은 당신에게 뭔가를 말해 줄 수 있습니다. – davogotland

+0

실행중인 URL을 게시 할 수 있습니까? (실제로는 그렇지 않습니다. 사용자 입력을 이스케이프하지 않을 것입니다 !!) –

답변

2

입력 스트림 또는 오류 스트림을 캡처하지 않으면 프로세스의 잠재적 인 피드백이 누락되었습니다. 이전에 작성한 코드에서 다음 코드 (IDE의 편이성을 벗어남)를 적용 했으므로 명백한 오류가 있으면 사과드립니다.

import java.io.BufferedReader; 
import java.io.File; 
import java.io.IOException; 
import java.io.InputStreamReader; 
... 

String[] commands = {"/usr/bin/touch", "/home/blah/test.txt"}; 
//this could be set to a specific directory, if desired 
File dir = null; 
BufferedReader is = null; 
BufferedReader es = null; 

try 
{ 
    Process process; 
    if (dir != null) 
     process = Runtime.getRuntime().exec(commands, null, directory); 
    else 
     process = Runtime.getRuntime().exec(commands); 
    String line; 
    is = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while((line = is.readLine()) != null) 
     System.out.println(line); 
    es = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
    while((line = es.readLine()) != null) 
     System.err.println(line); 

    int exitCode = process.waitFor(); 
    if (exitCode == 0) 
     System.out.println("It worked"); 
    else 
     System.out.println("Something bad happend. Exit code: " + exitCode); 
} //try 
catch(Exception e) 
{ 
    System.out.println("Something when wrong: " + e.getMessage()); 
    e.printStackTrace(); 
} //catch 
finally 
{ 
    if (is != null) 
     try { is.close(); } catch (IOException e) {} 
    if (os != null) 
     try { es.close(); } catch (IOException e) {} 
} //finally 
+0

코드가 문제를 해결하지 못합니다. 서블릿이 제대로 리디렉션되지 않습니다. – artaxerxe

+2

@artaxerxe - 무슨 뜻인지 잘 모르겠습니다. 리디렉션에 대한 원래 게시물에는 아무 것도 없습니다. 또한 내가 제공 한 코드 예제는 입력 스트림과 오류 스트림을 읽는 방법을 보여주기위한 것입니다. 서블릿 예제는 아닙니다. –

1

당신은 무엇인가를 혼란스럽게하고 검색 경로와 같이 모든 멋진 것들을 가진 셸을 사용하고 있습니다.

원하는 프로세스의 전체 경로를 exec()으로 지정하십시오. 예 : /usr/bin/touch 또는 /path/to/java