Как запустить сценарий оболочки из Java и продолжить его работу после завершения работы JVM?

1

Я пишу плагин, чтобы перезапустить серверное приложение в 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?

  • 3
    ты пробовал nohup?
  • 0
    Спасибо, я никогда не слышал о nohup, но это именно то, что мне было нужно. Отправьте это как ответ, и я приму это!
Теги:
macos
process

1 ответ

2
Лучший ответ

Когда вы запускаете процесс из 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();
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню