이번에 RMF Patch Program 을 작성하면서

Shell의 Output을 Java로 읽어 들이는 Program을 작성하게 되었다.

마침 예전 테라스때 Keytool을 이용한 인증서 저장 프로그램을 짜면서

Java내에 인증서를 핸들링하는 Class가 없어서 Shell command를 이용하도록 하던 Code를 작성한 경험이 있어서 손 쉽게 접근할 수 있었다.

근데 막판에 부하테스트 하면서 예상하지 못했던 Issue가 발생했다.

shell 쪽에서 해야 할 일이

find 로 특정 이름의 파일을 찾아 그 결과를 이용하여 java class가 구동되어야 하는데

처음에 데이터가 작을 때는 잘 작동 되던 것이

데이터가 많아 지니 멈추는 현상이 발생했다.

코드는 아래와 같은 식이 었는데

정확히 어디 쯤에서 멈추는지 까지는 Tracing 하지는 않았지만

아마도 prss.waitFor 구문에서 나오는거 아닐까 하는 생각이 든다.

일단은 sun community에 질문을 올려 놓기는 했는데

어떤 답이 올지 모르겠다.

http://forums.sun.com/thread.jspa?threadID=5345804

아참 글구 이런 문제가 생겼던 근본적인 문제점은...

find . -name XXX -print > b.txt

를 Runtime & Process를 이용해서 구혔했었는데

이때 Redirect 가 처리가 되지 않아서 에러가 발생했었다.

결국 Redirect를 쓰지 않고 하려다 보니 stdout을 받아서 처리 하려 했던 것이다.

( 해결은 find option 중에 -fpint를 쓰게 되면 redirect를 쓰지 않고도 파일로 결과를 저장할 수 있었다. )

Runtime rn = Runtime.getRuntime();
Process prss = rn.exec(command);

InputStream stderr = prss.getErrorStream();
InputStreamReader isr = new InputStreamReader(stderr);
BufferedReader br = new BufferedReader(isr);
String line = null;
StringBuffer errmsg = new StringBuffer();
while ( (line = br.readLine()) != null)
errmsg.append(line);

InputStream stdout = prss.getInputStream();
InputStreamReader isr2 = new InputStreamReader(stdout);
BufferedReader br2 = new BufferedReader(isr2);
List<String> outmsg = new ArrayList<String>();
String line2 = null;
while( ( line2 = br2.readLine() )!= null)
outmsg.add(line2);

int prss_rslt = prss.waitFor();
if ( prss_rslt != 0 ){

throw new Exception(account+ "'s creative file touch is fail. it return "prss_rslt"error code.\n"+errmsg.toString());

}

'개발자세상 > 자바세상' 카테고리의 다른 글

ClassPath에 있는 파일 가져오기.  (0) 2009.03.18
JavaFX?  (0) 2009.02.03
JVMPI, JVMTI  (0) 2008.07.30
Java One 2008 방문 후기를 보고  (0) 2008.06.26
BPM에 빠져 들다.  (0) 2007.07.11
Posted by headiron
,