2016-01-17 3 views
2

У меня есть программа Java, которая запускает другой процесс с ProcessBuilder, как следующее:Как запустить proccess полностью отдельный в Java

String commands[] = {"ruby", "/home/scripts/script.rb"}; 
ProcessBuilder builder = new ProcessBuilder(commands); 
Map<String,String> map = builder.environment(); 
map.put("TYPE", "sometype"); 
try { 
    builder.start(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Через некоторое время после того, как процесс начинает выполняться (небольшой Ruby, сценарий, который не должен прекращать) программа Java завершает работу.

Проблема заключается в том, что после завершения выполнения Java-программы все подпроцессы закрыты, а также Ruby Script.

Я нашел несколько похожих вопросов, но ответ был всегда, процесс независим. Но это не похоже на то, что в моем случае код Ruby будет всегда прекращать выполнение, если программа Java выйдет.

Я попробовал код Java на системе Jessie Debian с Java 8u66

+4

Запустите процесс с помощью 'nohup'. –

+0

@ElliottFrisch Является ли 'nohup' чем-то вроде' screen'? Не закончится ли процесс nohup после завершения Ruby? – Ybrin

+1

Вид. И да. –

ответ

1

Проблема заключается в том, что после завершения Java-программы все подпроцессы закрыты, а также Ruby Script.

В * NIX системах (POSIX действительно, включая Debian Linux) процесс послал HUP signal (SIGHUP или зависание), когда заканчивается его родительский процесс. Вы можете использовать команду nohup(1) при запуске подпроцесса до ignorehangup от процесс.

В качестве альтернативы, вы можете потенциально делают использование Ruby, Signal Module и использовать Signal.trap(HUP), чтобы справиться с этим другим способом.

-1

Попробуйте использовать Process.getOutputStream, ждать выхода из процесса с пробегами Ruby, и если он занимает слишком много времени, то вы можете запустить на заднем плане.

+0

Я не хочу ждать, пока Ruby Script завершит выполнение перед выходом из Java. Как начать процесс в фоновом режиме с Java? – Ybrin

+0

вы можете добавить nohup или & в свой массив команд, чтобы выполнить этот процесс в фоновом режиме в java. ProcessBuilder builder = новый ProcessBuilder ("nohup ruby ​​/home/scripts/script.rb &"); – Vikas

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