有没有办法动态重启循环打印输出的HelloWorld Java程序?

有没有办法动态重启循环打印输出的HelloWorld Java程序?,java,restart,Java,Restart,考虑以下永远打印“Hi world”的简单代码: 以下是输出: 有没有办法设计一个外部的第三个程序,当我们杀死这个程序时,它会注意到这个程序(就像在命令行中使用CTRL+C);然后这个“家长”程序继续运行“Hello World” 我想可能是这样的: 所以我的问题是-我如何模拟这样的代码,它具有这种故障安全功能?有没有办法做到这一点 谢谢 编辑:我在这里找到了一个简洁的链接,它是相关的,但解决了一些不同的问题-如果它像这样简单,你可以简单地使用关闭钩子 Runtime.getRuntime(

考虑以下永远打印“Hi world”的简单代码:

以下是输出:

有没有办法设计一个外部的第三个程序,当我们杀死这个程序时,它会注意到这个程序(就像在命令行中使用CTRL+C);然后这个“家长”程序继续运行“Hello World”

我想可能是这样的:

所以我的问题是-我如何模拟这样的代码,它具有这种故障安全功能?有没有办法做到这一点

谢谢


编辑:我在这里找到了一个简洁的链接,它是相关的,但解决了一些不同的问题-

如果它像这样简单,你可以简单地使用关闭钩子

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

尽管您可能会遇到一些问题,但如果您想重新启动程序并使用相同的命令行。

您可以使用关机挂钩再次启动应用程序。请注意这一点的缺点——JVM永远不会停止运行,除非您强制杀死它


首先,这是一项具有挑战性的任务。试试看,让我知道它是否有效

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();
        }
    }
}

Shutdown钩子保证在程序的正常关闭事件上运行,但不能在各种异常终止上运行,例如JVM被强制终止时

一种解决方案可能是使用批处理脚本:

@echo off
setlocal

start /wait java WakeMeUpSomehow

if errorlevel 1 goto retry
echo Finished successfully
exit

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

不必详细说明您希望这样做的原因:-),一种“健壮”的方法是在以下位置执行“父”程序或批处理脚本:

  • 用于执行java程序的Windows服务,如中所述
  • 第三方调度程序
  • 如果您在Linux上,则可以使用init守护进程或Cron调度程序

  • 以上方法甚至可以承受计算机重启

    在Windows中,执行此操作的方法是将程序作为服务运行。它允许在系统启动时启动程序(没有用户登录),并在程序关闭时重新启动程序。Windows资源工具包提供了一个名为SrvAny.exe的程序,允许您将任何程序作为服务运行

    你应该结账。它提供了许多实用程序,而不仅仅是重新启动一个程序

    例如

  • 它检查您的程序是否消耗了更多内存(可能是由于内存泄漏)
  • 监视文件更改
  • 重新启动程序以防崩溃
  • 基于脚本的自定义启动选项支持

  • 听起来您希望将应用程序作为服务运行(windows)或守护进程运行(Unix)

    在Java中,您通常会为此使用服务包装器。我用这个

    Commons Daemon在Windows上提供了将Java应用程序作为服务运行的功能。您甚至可以将可执行文件重命名为程序的可执行文件。在Unix上,您可以重新启动Java应用程序。我在我的主类中编写了一个精简的通用启动API,由两个可执行文件调用



    如果您需要在生产环境中这样做(而不是作为某种练习),我相信这是唯一可靠的方法。

    @AbdulAhmad-我想是的,在Linux中,您通常如何使用init进程(例如upstart或systemd)来管理长时间运行的服务。也许Windows也有类似的功能?@ChrisMartin-那么对于Linux来说,这个任务很简单?我可以尝试将Linux与虚拟机结合使用“简单”是一种延伸,仅此就有些过分了,但也许是一个很好的学习练习?:)所以我猜
    addShutdownHook()
    代码可以放在原始类中,然后我们可以做任何我们喜欢的事情。只需在进入while循环之前添加它,它就可以完成它的jobOne注释了——我确实做到了,但是。。。。大括号内有一个线程,对吗?参数是一个
    可运行的
    addShutDownHook
    创建一个处于初始化状态的
    线程,该线程将在应用程序退出时启动。大括号内是当关闭钩启动时将运行的代码。你们中的任何人都可以在这里发布完整的代码吗?我试过了,但作业没有起作用:(你介意分享那个链接上的内容吗?我不太愿意打开外部链接当我尝试用
    CTRL+C
    终止程序时,它实际上进入了一个无限循环(打印“hello world from run”)我不能
    CTRL+C
    这就是你想要的,什么是
    3PP调度程序。例如,check,java应用程序最著名的调度程序之一,嗯?我不知道你的意思。这可以称为“看门狗脚本”。我觉得这很有趣。上面写着
    ,但是在应用程序不是交互式的情况下(服务器应用程序),目前没有便携的方式通知虚拟机即将关闭。
    -尽管我如何使用它仍然有点模糊。那么您已经创建了一些代码来重新启动您自己的程序?@Coffee Commons守护程序通过提供一个小型本机可执行文件来工作,该文件可以在自己的进程空间中运行JVM或宿主JVM.dll。然后,它通过各种API方法调用应用程序,包括捕获系统信号时(例如CTRL+C)。结果是,应用程序可以作为服务运行(甚至可以交互运行)。许多生产Java服务器应用程序都使用这种方法。JSvc与
    supervise
    工具相比如何?我查了一个叫做daemontools的东西,发现了一个叫做“监督”的东西?我们很好奇你是否知道
    @echo off
    setlocal
    
    start /wait java WakeMeUpSomehow
    
    if errorlevel 1 goto retry
    echo Finished successfully
    exit
    
    :retry
    echo retrying...
    start /wait java WakeMeUpSomehow