Есть ли способ динамически перезапустить программу HelloWorld Java, которая выполняет цикл вывода вывода?

Рассмотрим следующий простой код, который навсегда печатает "Привет мир":

public class WakeMeUpSomehow {

 public static void main(String[] args) {

    while (true) {
    try {
         System.out.println( " Hi world ");
         Thread.sleep(1000);                 //1000 milliseconds is one second.
    } catch(InterruptedException ex) {
         Thread.currentThread().interrupt();
    }
    }
 }
}

Вот результат:

enter image description here

Есть ли способ разработать внешнюю третью программу, которая следит за тем, чтобы эта программа заметила, когда мы ее убиваем (например, с помощью CTRL + C в командной строке); а затем эта "родительская" программа возобновляет работу "Hello World"?

Я думаю, что это может выглядеть примерно так:

enter image description here

Итак, мой вопрос: как я могу имитировать такой код, который обладает такой отказоустойчивой способностью? Есть ли способ сделать это?

спасибо!

EDIT: я нашел здесь опрятную ссылку, которая имеет значение, но обращается к чему-то немного другому - Как перезапустить Java-приложение?

Ответ 1

Завершающие перехватчики гарантированно работают при нормальных событиях завершения программы, но не при всех видах ненормального завершения, например, когда JVM убивается принудительно.

Одним из решений может быть использование пакета script:

@echo off
setlocal

start /wait java WakeMeUpSomehow

if errorlevel 1 goto retry
echo Finished successfully
exit

:retry
echo retrying...
start /wait java WakeMeUpSomehow

Ответ 2

Если это так просто, вы можете просто использовать shutdownhook.

Runtime.getRuntime().addShutdownHook(() -> {
    //do whatever you want to be done when closing the program here
});

Хотя вы можете столкнуться с некоторыми проблемами, если вы хотите перезапустить программу и использовать ту же командную строку.

Ответ 3

прежде всего это сложная задача. просто попробуйте и дайте мне знать, работает ли это или нет!!!!!

public class WakeMeUpSomehow {
    static class Message extends Thread {

        public void run() {
            try {

                while(true)
                {
                System.out.println("Hello World from run");

                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            Runtime.getRuntime().addShutdownHook(new Message());
            while(true)
            {
            System.out.println("Hello World");
            Thread.sleep(100);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Ответ 4

Вы можете использовать hookdown, который запускает ваше приложение еще раз. Обратите внимание на недостаток этого - ваша JVM никогда не перестанет работать, пока вы не убьете ее.

http://wrapper.tanukisoftware.com/doc/english/qna-shutdown.html

Ответ 5

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

Вышеупомянутые подходы даже выдерживают перезагрузку компьютера!

Ответ 6

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

Например,

  • Он проверяет, потребляет ли ваша программа больше памяти (возможно, из-за утечки памяти).
  • Мониторинг изменений файлов.
  • Перезагрузите программу, если она сработает.
  • Script поддержка настройки параметров запуска.

Ответ 7

Похоже, вы хотите запустить приложение как Сервис (Windows) или Daemon (Unix).

В Java для этого обычно используется служебная оболочка. Для этого я использую Apache Commons Daemon.

Commons Daemon предоставляет ProcRun.exe в Windows для запуска вашего приложения Java как службы. Вы даже можете переименовать исполняемый файл в исполняемый файл. В Unix у вас есть JSvc для перезапуска вашего приложения Java. Я пишу тонкий универсальный API запуска в моем основном классе, который вызывается обоими исполняемыми файлами.

Это единственный способ, по моему мнению, сделать это надежно, если вам нужно сделать это в процессе производства (а не как какое-то упражнение).

Ответ 8

В Windows способ сделать это - запустить вашу программу как услугу. Это позволяет, среди прочего, возможность запуска вашей программы при запуске системы (без входа в систему) и перезапустить вашу программу, если она отключится. В наборах ресурсов Windows была предусмотрена программа SrvAny.exe, которая позволяет запускать любую программу в качестве службы.

https://support.microsoft.com/en-us/kb/137890