2016-08-16 4 views
0

У меня есть этот скрипт ниже (так называемый 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-кода?

+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, это не решает проблему в моем случае. Кстати, я установил .war моего приложения на tomcat на сервере Linux. когда я отлаживал локальную (мою машину Windows) с этим .bat, эквивалентным этому .sh, он работал хорошо. У вас есть идея, как отслеживать это из пакета приложений из tomcat на сервере Linux, пожалуйста? –

ответ

0

Ваш скрипт compute.sh может выводить ошибки без вашего ведома. Вы должны захватить выходные и потоки ошибок. Следующий пост должен помочь с этим: ProcessBuilder: Forwarding stdout and stderr of started processes without blocking the main thread

+0

Привет всем, извините за мой поздний ответ. Я решил проблему так: Shell '#/бен/Баш экспорт ROOTSH =/дом/path_to_files кд $ ROOTSH root.exe -b -l -q my_macro.cpp ROOT_PID = $! echo $ ROOT_PID> .lock' Java: 'Process p = new ProcessBuilder(). InheritIO(). Command (« путь к файлу .sh »). Start(); p.waitFor(); ' Спасибо всем за помощь. –

Смежные вопросы