Создайте процесс в Java, который переживает завершение JVM - PullRequest
13 голосов
/ 17 ноября 2008

Мне нужно создать процесс на Java (исключительно под Linux), который продолжит работать после выхода из JVM. Как я могу это сделать?

В основном приложение Java должно порождать средство обновления, которое останавливает приложение Java, обновляет файлы и затем запускает его снова.

Меня интересует метод взлома и слеша, чтобы он работал, а также лучшее дизайнерское предложение, если оно у вас есть:

Ответы [ 7 ]

17 голосов
/ 17 ноября 2008

Если вы порождаете процесс, используя java.lang.Process, он должен «просто работать» - я не верю, что порожденный процесс умрет, когда выйдет JVM. Возможно, вы обнаружите, что библиотеки Ant упростят вам контроль нереста.

10 голосов
/ 17 ноября 2008

На самом деле «просто работает», если только вы не пытаетесь быть умным.

Мой завернутый java.lang.Process пытался перехватить выходные данные скрипта, поэтому, когда JVM умерла, у сценария не было места для отправки вывода, поэтому он просто умирает. Если я не пытаюсь записать вывод, или скрипт не генерирует ничего, или перенаправляет все в файл или / dev / null, все работает как надо.

3 голосов
/ 14 сентября 2016

У меня были проблемы с этим, и запущенный процесс был убит при завершении работы JVM.

Перенаправление stdout и stderr в файл решило проблему. Я предполагаю, что процесс был привязан к запущенному java-приложению, так как по умолчанию он ожидал передать ему свой вывод.

Вот код, который работал для меня (за исключением обработки исключений):

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(logFile);
pb.redirectError(logFile);
Process p = pb.start();
0 голосов
/ 30 ноября 2011

>> не верьте, что порожденный процесс умрет при выходе из JVM.

Дочерний процесс всегда умирает на моей коробке (SuSE) всякий раз, когда я убиваю Java. Я думаю, дочерний процесс умрет, если он имеет дело с вводом-выводом родительского процесса (т. Е. Java)

0 голосов
/ 27 июля 2009

Это не всегда "просто работает". Когда JVM порождает дочернего элемента, а затем выключается, дочерний процесс также отключается в некоторых случаях. Это ожидаемое поведение процесса. Под системами WIN32 это просто работает.

например. Если сервер WebLogic был запущен процессом Java, а затем этот процесс завершается, он также отправляет сигнал выключения в WebLogic через ловушку отключения в JVM, что также приводит к завершению работы WebLogic.

Если это «просто работает» для вас, то проблем нет, однако, если вы оказались в положении, когда дочерний процесс также отключается с помощью JVM, стоит взглянуть на команду «nohup». Процесс не будет реагировать на сигнал SIGTERM, но будет реагировать на сигнал SIGKILL, а также на обычные операции.

Обновление: способ, описанный выше, немного излишним. Еще один способ сделать это - использовать «&» в конце команды. Это создаст новый процесс, который не является дочерним по отношению к текущему процессу Java.

P.S. Извините за столько обновлений, я изучал и пробовал это с нуля.

0 голосов
/ 17 ноября 2008

Если вы хотите создать программу обновления для Linux, вы, вероятно, ошибаетесь в дереве. Я считаю, что во всех основных дистрибутивах Linux есть встроенный менеджер пакетов. Вы должны использовать менеджер пакетов для обновления. Ничто не расстраивает меня больше, чем программы, которые пытаются самообновиться ... (Я смотрю на тебя, Eclipse)

0 голосов
/ 17 ноября 2008

Я думал, что весь смысл Java в том, что он полностью содержится в JVM. Байт-код довольно сложно запустить, когда нет времени выполнения.

Если вам нужен совершенно отдельный процесс, вы можете попытаться запустить второй экземпляр java.exe. Хотя для вашего приложения может быть проще создать синхронизированный блок, который останавливает (но не убивает) ваше приложение, выполняет обновление, а затем повторно инициализирует данные вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...