2012-06-24 1 views
1

자바, 나는 다음과 같은 코드를 사용하여 Java에서 명령 창을 실행하려고

Process p=Runtime.getRuntime().exec("wget www.anyurl.com/index.html); 

을 런타임 클래스를 사용하여 명령 및 그것은 작동하지만 다음과 같이 또 다른 명령을 실행하려고 할 때 ,

Process p1=Runtime.getRuntime().exec("pscp -pw sysadmin c:/mydirectory/mypage.html [email protected]:/home/usr"); 

작동하지 않는 것 같습니다. 첫 번째 프로세스 라인 (즉 프로세스 p)을 주석 처리하면 프로세스 p1이 정상적으로 작동하고 실행되고 파일이 성공적으로 복사되었음을 보여줍니다. 아무도 왜 이런 일이 일어 났는지 말해 줄 수 없습니까?

+0

"는 작동하지 않습니다"정의합니다. 무슨 일이야? –

+0

첫 번째 명령을 완료해야 두 번째 명령을 성공적으로 호출 할 수 있습니까? –

+0

안녕하세요 JB Nizet은 첫 번째 명령 (즉, wget을) 잘 작동하지만 나는 그것이 작동하지 않는 PSCP를 실행하려고 내가 첫 번째 라인을 언급하는 경우 (즉, 프로세스 P = Runtime.getRuntime()시. 간부를 ("www.anyurl.com을 wget 용 /index.html이);) 다음 PSCP가 작동 잘 – Mahesh

답변

4

당신은 "wget을"프로세스가 현재 구현에서 읽어 본 적이있다 출력을 생성하기 때문에 다른 프로그램이 차단됩니다, 첫 번째 프로세스의 흐름을 정리해야합니다. 첫 번째 프로세스의 출력 및 오류 스트림을 정렬해야합니다. 예를 들어 답을보세요. another question about java-runtime-exec on SO.

아래의 코드

은 참조를 위해 작동하지만 wget과는 표준 출력으로 표준 오류 및 PSCP에 출력을 생성한다는 사실에 의존한다. 어떤 것이 다른 해당 스트림으로 출력되면 코드는 첫 번째 스트림을 비울 때 출력이 Java 프로그램의 버퍼에 들어갈 때까지 작동합니다 (이 버퍼 크기는 플랫폼마다 다릅니다). 버퍼가 가득 차면 명령 실행이 차단됩니다. 프로세스의 적절한 스트림을 읽는 stout 및 stderr에 대해 별도의 스레드를 만들어야합니다.

import java.io.BufferedReader; 
    import java.io.InputStreamReader; 

...

Process p=Runtime.getRuntime().exec("wget http://www.duckduckgo.com/"); 

    BufferedReader perr=new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    BufferedReader pout=new BufferedReader(new InputStreamReader(p.getInputStream())); 
    // We read stderror first from wget, because it spits the progress information into stderr 
    for (String s=perr.readLine(); s!=null; s=perr.readLine()) 
    { 
     System.out.println("Stderr from p: "+s); 
    } 
    for (String s=pout.readLine(); s!=null; s=pout.readLine()) 
    { 
     System.out.println("Stdout from p: "+s); 
    } 
    // if you need to check whether the command actually returned normally 
    int returnCode = p.waitFor(); 
    perr.close(); 
    pout.close(); 

    System.out.println("Returned from p with exit code "+returnCode); 

    p=Runtime.getRuntime().exec("pscp -pw dontuseplainpwusesshkeys index.html [email protected]:"); 
    perr=new BufferedReader(new InputStreamReader(p.getErrorStream())); 
    pout=new BufferedReader(new InputStreamReader(p.getInputStream())); 
    // We read stdout of pscp first because pscp spits stuff into stdout. 
    // The process will block if the buffer gets full and does not get emptied. 
    for (String s=pout.readLine(); s!=null; s=pout.readLine()) 
    { 
     System.out.println("Stdout from p: "+s); 
    } 
    for (String s=perr.readLine(); s!=null; s=perr.readLine()) 
    { 
     System.out.println("Stderr from p: "+s); 
    } 

    int returnCode1 = p.waitFor(); 
    perr.close(); 
    pout.close(); 

    System.out.println("Process exited with return code "+returnCode1); 
+0

안녕 데이비드을 첫 번째 명령은 두 번째 명령이 실행되기 전에 잘 작동이 – Mahesh

+0

JPE 안녕하세요, 저는 당신의 제안에 노력하고 다시 연락. – Mahesh

+0

안녕 얘들 아, 나는 여기 제공하고 있어요 내 코드를 살펴보고이 코드의 잘못된 점을 알려주십시오. String inpu BufferedReader br; br = new BufferedReader (새 InputStreamReader (System.in)); 입력 = br.readLine(); 경우 (input.equals ("다운로드")) { \t 프로세스 p = Runtime.getRuntime() 간부 ("wget을 www.anyurl.com/index.html). 한다} else 경우 (입력. – Mahesh