Создайте процесс на Java, который выживает при остановке JVM

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

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

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

Ответ 1

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

Ответ 2

Он действительно "просто работает", если вы не пытаетесь быть умным.

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

Ответ 3

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

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

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

ProcessBuilder pb = new ProcessBuilder(cmd);
pb.redirectOutput(logFile);
pb.redirectError(logFile);
Process p = pb.start();

Ответ 4

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

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

Ответ 5

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

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

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

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

P.S. Извините за так много обновлений, я учился и пытался с нуля.

Ответ 6

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

Когда я убиваю java, дочерний процесс всегда умирает на моем ящике (SuSE). Я думаю, что дочерний процесс умрет, если он имеет дело с I/O родительского процесса (то есть, java)

Ответ 7

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