2016-06-21 1 views
0

서브 프로세스를 (ProcessBuilder 통해) 시작하고 다른 스레드의 I/O (Process.getInputStream(),Process.getErrorStream(),Process.getOutputStream()) 스트림을 처리하는 Java 프로그램을 작성했습니다.자바 서브 프로세스 콘솔에 여분의 출력

내 java-program은 서버로 작동하며 하위 프로세스에서 콘솔에 여분의 출력을 보내지 않고 IDE 콘솔에서 IDE의 콘솔로 제대로 작동하지만 Windows 또는 Windows에서 java -jar ... 프로그램을 실행하려고하면 리눅스 콘솔, 하위 프로세스는 내 프로그램과 콘솔에 출력을 씁니다.

P. 내가 파이썬 스크립트 파일을 자바에서 실행합니다. 예를 들어 파이썬 스크립트 스크립트는 "Hello World"라는 테스트 문자열을 1000 번 인쇄합니다. 내 프로그램이 잘 처리하지만 콘솔에서도 결과를 볼 수 있습니다.

어떻게 든 프로세스에서 분리해야하는 "콘솔"이 있습니까?

UPDATE :

여기

내가 파이썬을 실행하기위한 ProcessBuilder를 얻을 (I 매개 변수로 스크립트의 디렉토리를 통과) : 여기

private ProcessBuilder getBuilder(File directory) { 
    return new ProcessBuilder("python", "-u").directory(directory); 
} 

내가 빌더에서 프로세스를 시작하고 추가 치료 ( 스크립트의 디렉토리를 전달하고 스크립트에 args)를 반환합니다.

public Process execute(Path dir, String... args) { 
    if (!Files.exists(dir) || !Files.isDirectory(dir)) 
     throw new IllegalArgumentException("Provided path " + dir + " is not a directory or doesn't exist"); 
    ProcessBuilder builder = getBuilder(dir.toFile()); 
    if (args.length > 0) { 
     builder.command().addAll(Arrays.asList(args)); 
    } 
    try { 
     return builder.start(); 
    } catch (IOException io) { 
     io.printStackTrace(); 
     return null; 
    } 
} 
i=0; 
while True: 
    if i%1000000==0: 
     print ('Hello, world!') 
    i+=1 

그들이 다른 주제에 있었다 표준 gobblers 모습 때문에 sence 내 스트림 핸들러가 게시 할 경우 나도 몰라하지만 그들은에 처리 출력/오류 읽기 : 여기테스트 바보 스크립트입니다 대기열에서 다른 대기열에서 입력을 가져오고 Java 프로그램은 대기열을 처리하고 로거 메시지를 제외하고 콘솔에 출력하지 않습니다.

하지만 하위 프로세스 자체가 콘솔에 쓰는 것 같지만 어쩌면 틀 렸습니다.

+0

자바 코드를 보여줘야 사람들이 당신이 말하는 것에 대해 생각할 수 있습니다. –

+0

다음과 같이 : Java 코드 (최소한 관련 부분)를 보여줍니다. [redirectOutput()'] (https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectInput%28java.lang.ProcessBuilder.Redirect%29)를 올바르게 설정 했습니까?) 및 ['redirectError()']] (https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#redirectError%28java.lang.ProcessBuilder.Redirect%29)? – dhke

+0

@dhke Process 객체를 얻은 다음 process.getOutputStream(), process.getInputStream(), process.getErrorStrem()을 통해 IO를 가져옵니다. –

답변

0

프로그래밍 방식으로 수행하는 방법을 찾지 못했습니다. jar 파일을 시작할 때 출력을/dev/null로 리디렉션하는 것이 유일한 방법입니다. 네트워크를 통해 클라이언트에 출력되기 때문에 상당히 적합합니다.

관련 문제