У меня есть этот скрипт ниже (так называемый compute.sh и используется для запуска приложения ROOT (CERN) (root.exe) и выполнить некоторые C++ макросов с ним)Выполнить сценарий оболочки из кода Java
#!/bin/bash
ROOTSH=/path/to/files root -b -l macro.cpp
$ROOTSH &
ROOT_PID=$!
echo $ROOT_PID > .lock
В порядке чтобы запустить этот .sh из моего Java приложение развертывается на одном сервере Linux я использую:
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");
}
Но когда я пытаюсь запустить этот .sh из UI-го, у меня ничего нет, никаких результатов и никаких ошибок. И когда я запускаю .sh извне java-кода, он отлично работает.
У кого-нибудь есть идея, как с этим справиться? Или Есть ли другой способ убедиться, что скрипт оболочки будет запущен из java-кода?
Отлаживайте свой код. Если он никогда не достигает инструкции 'catch' и остальной части метода, сценарий работает неопределенно (возможно, по причинам, связанным с памятью). Также предпочтительной методологией является использование [ProcessBuilder.start] (https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#start%28%29). – Mena
Также проверьте правильность рабочего каталога. Сценарий bash не устанавливает его, и ваш код Java также не используется. – Siguza
@Mena: Я пытался с ProcessBuilder.start, это не решает проблему в моем случае. Кстати, я установил .war моего приложения на tomcat на сервере Linux. когда я отлаживал локальную (мою машину Windows) с этим .bat, эквивалентным этому .sh, он работал хорошо. У вас есть идея, как отслеживать это из пакета приложений из tomcat на сервере Linux, пожалуйста? –