2009-10-15 3 views
0

웹 응용 프로그램을 통해 셸 스크립트를 실행하고 있습니다. 이 셸 스크립트는 다음과 유사합니다.JSP/Servlet의 셸 스크립트를 통해 Java 응용 프로그램 실행

`#! /bin/bash 
user="" 
pass="" 
db_url="" 
db_instance="" 
sqlplus -s $user/[email protected]$db_url/$db_instance @ ./SqlScripts/foo.sql 
sqlplus -s $user/[email protected]$db_url/$db_instance @ ./SqlScripts/bar.sql 
CLASS_PATH="./lib/*" 
java -classpath $CLASS_PATH package.Main ./Data/inputfile` 

스크립트를 실행하기 위해 ProcessBuilder를 사용하고 있지만 마지막 줄은 문제없이 작동합니다. jvm을 통해 쉘을 호출하여 응용 프로그램을 실행하기 위해 jvm을 다시 호출하여 문제가 발생합니까?

+0

오류 메시지가 표시됩니까? 잘 작동하지 않으면 어떻게 알 수 있습니까? :-) –

+0

오류 메시지가 없습니다. 출력이없고 웹 응용 프로그램을 실행할 때 중단됩니다. 스레드가 대기 상태가되어 절대로 나가지 않습니다. – Kyle

+0

-1 잘못된 입력을 제공합니다.카일 그것은 실제 코드 (또는 심지어 실제 샘플)를 게시하면 훨씬 쉬울 것입니다 – OscarRyz

답변

0

상위 JVM과 하위 JVM은 별도의 프로세스 여야하며, 간섭해야하는 특별한 이유는 없습니다.

어떤 오류가 발생합니까?

은 PATH에 java입니까?

OK, ... 당신의 의견에 대한 응답으로 질문을 더 추가

대기하는 스레드? 아마 부모님?

자식 자바 프로세스, 당신은 성공적으로 initalises 여부에 대한 증거가 필요합니까. 내 생각에 그 아이는 어떤 식 으로든 막혀있다. 당신이 아이를 죽이면 부모는 다시 삶으로 돌아 간다?

간단한 "hello world"응용 프로그램이라고 가정 해 봅시다.

+0

예 java가 PATH에 있습니다. 대기 상태를 벗어나지 않는 스레드로 인해 오류가 발생하지 않습니다. – Kyle

0

종종 앱 서버는 '클린 룸'환경에서 서블릿을 실행합니다. 일반적으로 보안상의 이유로 외부에서 설정되는 모든 변수를 제거합니다. java 바이너리에 대한 완전한 경로를 사용하고 CLASS_PATH 변수의 전체/절대 경로를 설정해보십시오.

+0

응용 프로그램 서버와 독립 실행 형 응용 프로그램의 경우 문제는 $ ENV_VAR이 프로그램이 아니라 쉘이 이해하는 것입니다. 다른 프로그래밍 언어에서도 마찬가지입니다. – OscarRyz

0

대부분의 경우 라인 :

CLASS_PATH="./lib/*" 

그리고

$CLASS_PATH 

이 보통이 상황에서 호출되지 않는 포탄 '작업, 때문에 그것은 프로세스 빌더로 확장되지 않습니다.

./lib/*의 전체 목록을 만들고 스크립트의 마지막 줄에 직접 추가하십시오.

java -classpath ./lib/a.jar:./lib/b.jar 

사이드 참고 :

자바에서 모든 호출은 나에게 단지 나쁜 보인다. 차라리 독립형 스크립트에서 사용하고 다른 방법으로 호출하는 것이지만 그게 나입니다.

+0

그 예는 ... 실제 스크립트가 아닙니다. – Kyle

1

문제는 스크립트 실행 프로세스가 실행되는 환경이었습니다. 프로세스의 환경 변수를 변경했는데 모든 것이 이제는 정상적으로 작동하고 있습니다. 이 스크립트는 처음에 독립형 쉘 스크립트 였지만 사용 된 각 데이터베이스에 대해 하나의 스크립트를 작성했습니다. 워크 플로를 제어하기 위해 각 스크립트에 대해 별도의 스레드를 호출하고 스레드를 관리 할 수있는 웹 응용 프로그램을 작성했습니다. 답변 주셔서 감사합니다!

관련 문제