Я пишу плагин, чтобы перезапустить серверное приложение в Linux (хотя я тестирую OSX). То, как я это делаю, это использовать сценарий оболочки, который приказывает приложению остановиться, а затем наблюдает за смертью процесса, безопасно начиная новый, когда придет время.
Мой скрипт работает, когда я запускаю его вручную из командной строки. Однако, когда я выполняю его из приложения, процесс оболочки уничтожается вместе с приложением.
Я пробовал два разных метода запуска процесса с Java:
String scriptArgs[] = {"sh", "restart.sh", "&"};
try {
Runtime.getRuntime().exec(scriptArgs);
} catch (IOException e) {
e.printStackTrace();
}
а также
ProcessBuilder processBuilder = new ProcessBuilder("sh", "restart.sh");
try {
processBuilder.directory(new File(System.getProperty("user.dir")));
processBuilder.redirectErrorStream(false);
processBuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
Оба эти метода дали тот же результат: был вызван сценарий, он успешно закрыл приложение, а затем он умер, прежде чем он смог продолжить. Есть ли способ начать полностью независимый процесс с Java?
Когда вы запускаете процесс из java, вы создаете экземпляр оболочки, который затем запускает процесс. Оболочка будет завершена только после завершения этого процесса, даже если она выполняется в фоновом режиме &
Чтобы запустить процесс в режиме без звука, вам необходимо использовать команду nohup
. Подробнее см. Здесь.
Использование может выглядеть так:
ProcessBuilder processBuilder = new ProcessBuilder("nohup", "sh", "restart.sh");
try {
processBuilder.directory(new File(System.getProperty("user.dir")));
processBuilder.redirectErrorStream(false);
processBuilder.start();
} catch (IOException e) {
e.printStackTrace();
}