2012-04-16 3 views
0

파일과 SQL 테이블을 조작하고 데이터를 비교하는 JUnit 테스트에서 여러 쉘 스크립트를 호출하는 자바 프로그램에서 작업하고 있습니다. 상기 테이블들에서 그들의 예상 된 값들로. 이론적으로는 모든 것이 작동하지만 한 유형의 테스트가 예상대로 작동하는 반면 다른 유형은 10 분의 타임 아웃 후에 실패하는 문제가 발생합니다. 문제를 쉘 스크립트 중 하나로 분리했지만이 스크립트를 작성하지 않았으므로 어떤 방식 으로든 변경할 수는 없습니다. 이 문제를 해결할 수있는 가장 좋은 방법은 일련의 에코 호출에서 발생하는 문제의 스크립트 출력을 저장하는 것입니다. 에코 출력을 저장하는 데 다소 직접적이고 신뢰할 수있는 방법이 있습니까? 나는 조금 봤지만 아무 것도 나오지 않았다. 나는 당신을 보여하려는 시도를하지 않아도 아직 출력을 저장하기 위해 시도하지 않은,하지만 관련이있을 수 이미 작성한 코드는 다음과 같습니다 누군가 내가 물어 또 다른 질문에서쉘 스크립트의 에코 출력을 Java 내에서 저장하는 방법

//Currently using BufferedWriter, File, FileWriter, IOException, and Writer 
import java.io.*; 

//Method to write to a log file 
public void record(String input) throws IOException { 
    writer = new BufferedWriter(new FileWriter(file,true)); 
    writer.write(input + "\n"); 
    writer.close(); 
} 

Runtime rt = Runtime.getRuntime(); 

//Several of these since a lot of file manipulation/script running occurs 
process = rt.exec("./shell.sh"); 
process.waitFor(); 

몇 가지 이유로 Runtime.exec()를 사용하지 않는 것이 좋습니다. exec()를 사용하지 않는 것에 대한 이점을 알고 있지만,이 버전의 프로그램에 필요합니다.

질문 : 내 Java 프로그램에서 쉽게 쉘 스크립트를 실행하고 에코 결과를 저장할 수 있습니까? 그렇지 않다면 출력을 읽는 데 tail -f equivalent가 있습니까? 사용에 대해 새 스크립트 파일을 작성하는 방법

+0

나는 이것과 비슷한 질문이라고 생각한다. http://stackoverflow.com/questions/5711084/java-runtime-getruntime-getting-output-from-executing-a-commandline-program – DRCB

+0

Commons Exec을 사용할 수있다. . 예제는 http://stackoverflow.com/questions/6295866/how-can-i-capture-the-output-of-a-command-as-a-string-with-commons-exec를 참조하십시오. – Kkkev

답변

1

가능한 한 쉽게이 작업을 수행하려면 비동기 적으로 외부 프로세스 출력을 읽고 사용해야합니다. 그게 아마 차단하고 시간 초과를 일으키는 것입니다, 스크립트가 다시 내용을 보내고, 그들이 소비되지 않는 방법입니다.

I posted an answer to this exact same question a while ago이 외부 프로세스에서 읽을 때 모든 상황에서 작동하고, 더 이상 Process.exec()을 사용하고 ProcessBuilder을 사용하지 않는 이유의 이유입니다.

+0

머리가 긁힌 후 조금 더 많은 인터넷 검색 기능을 사용하면 현재 기능의 복잡성을 늘려야 할 때 가장 유용 할 것이므로이 방법을 결정했습니다. 제안 해 주셔서 감사합니다! – Chris

1

는 로그 파일에 에코를 리디렉션, scriptWithOutput.sh

#!/bin/sh 

log="someDir/someLog.log" 

# This saves all you "echoes" to the log file 
exec &> $log 

# Your shell script 
./shell.sh 

그리고 자바 코드에

다음
process = rt.exec("./scriptWithOutput.sh"); 

someDir/someLog.log을 읽으려고 자바로부터?

+0

쉘 스크립트를 작성하는 데 경험이 없지만이 아이디어가 마음에 들다. 가급적 자바에서이 문제를 해결하고 싶습니다. 자바를 디버깅/디버깅하는 데 가장 많은 경험이 있지만, 쉘 스크립터의 관점에서 시작한다면 초보 자습서를 시작할 것입니다. – Chris

관련 문제