2016-08-16 2 views
0

나는이 위해 (그것으로 compute.sh 전화를 ROOT 응용 프로그램 (CERN) (root.exe 시작) 및 일부 C를 실행하는 데 사용 ++ 매크로)스크립트 실행 쉘

#!/bin/bash 
ROOTSH=/path/to/files root -b -l macro.cpp 
$ROOTSH & 
ROOT_PID=$! 
echo $ROOT_PID > .lock 

아래 스크립트 내 자바에서이 보통 .sh를 시작 내가 사용하는 것과 동일한 리눅스 서버에 애플리케이션을 배치 :

try{ 
    Process p = Runtime.getRuntime().exec("/path/to/files/compute.sh"); 
    p.waitFor(); 
}catch(IOException ex){ 
    log.warn("Cannot find bat or sh to start ROOT"); 
}catch(InterruptedException ex){  
    log.warn("The ROOT execution is interrupted"); 
} 

하지만 UI 일부터이의 .sh를 시작하려고 할 때, 나는 아무 것도, 아무 결과없이 오류가 없습니다. 그리고 java 코드 외부에서 .sh를 실행하면 완벽하게 작동합니다.

아무도이 문제를 처리하는 방법을 알고 있습니까? 또는 쉘 스크립트가 java 코드에서 실행되는지 확인하는 다른 방법이 있습니까?

+1

코드를 디버깅하십시오. 'catch' 문이나 메소드의 나머지 부분에 결코 도달하지 않으면 스크립트가 무기한으로 실행됩니다 (아마도 메모리 관련 이유로). 또한 선호되는 방법론은 [ProcessBuilder.start] (https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#start%28%29)를 사용하는 것입니다. – Mena

+0

또한 작업 디렉토리가 올바른지 확인하십시오. bash 스크립트는이를 설정하지 않으며 Java 코드도 설정하지 않습니다. – Siguza

+0

@Mena : ProcessBuilder.start로 시도했지만,이 경우에는 문제가 해결되지 않습니다. btw, Linux 서버의 tomcat에 내 응용 프로그램의 .war를 설치했습니다. 이 .sh와 동등한이 .bat를 사용하여 로컬 (내 Windows 시스템)에서 디버깅 할 때 제대로 작동했습니다. 리눅스 서버에서 tomcat의 앱 패키지를 추적하는 방법을 알고 계십니까? –

답변

0

사용자의 지식없이 compute.sh 스크립트가 오류를 출력 할 수 있습니다. 출력 및 오류 스트림을 캡처해야합니다. 다음 게시물은 도움이됩니다. ProcessBuilder: Forwarding stdout and stderr of started processes without blocking the main thread

+0

안녕하세요, 최근 답변에 죄송합니다. 쉘 '#/빈/bash는 수출 ROOTSH =/가정/path_to_files CD를 $의 ROOTSH root.exe -b -l -q my_macro.cpp ROOT_PID = $ : 나는 이러한 방식으로 문제를 해결! echo $ ROOT_PID> .lock' Java : 'Process p = new ProcessBuilder(). inheritIO(). 명령 (".sh 파일 완료 경로") start(); p.waitFor(); ' 도움을 주셔서 감사합니다. –