Java程序应该听什么,才能成为一个好的Linux服务?

2022-09-01 13:11:14

在 Linux 中,您可以给出以下命令:

service <someService> start
service <someService> stop

而不是用 杀死进程。正如我在前面的问题中学到的,这就是发送过程a(前者)和a(后者)之间的区别。kill -9 <someService>SIGTERMSIGKILL

那么,如何将普通的JAR或WAR作为服务/守护进程进行“注册”(和编码),这些服务/守护程序可以使用这些命令启动和停止呢?我会想象Java必须有一些API来处理s?SIGTERM

提前致谢!


答案 1

如果您只想运行一些特定于关闭的代码,则“正确的Java”处理方式不会使用信号,而是添加一个通用的“shutdown hook”,该钩子将在应用程序即将终止时运行。这是Java有时遇到的最小公分母问题之一。(由于并非所有平台都支持,因此在Java中,没有平台支持。SIGINTSIGINT

不幸的是,您在 ShutdownHook 中没有太多上下文,但它可能仍然有用:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
    public void run()
    {
        // cleanup
    }
}));

如果你真的需要区分接收到的信号,或者你想支持Java通常忽略的信号(比如),或者你想根据一个信号中止关机,那么不幸的是,a对你来说基本上是无用的。USR1ShutdownHook

有一种不受支持、文档记录不佳的方法,可以使用该类在 Sun JVM 中捕获信号。这是值得怀疑的,尽管IBM JVM似乎也支持这一点sun.misc.SignalHandler

例如 - 您可以挂接一个信号处理程序来监听重新加载您的服务器配置,该配置在脚本中设置为谓词:SIGHUPinit.dreload

Signal.handle(new Signal("HUP"), new SignalHandler() {
    public void handle(Signal signal)
    {
        reloadConfiguration();
    }
});

至于配置要使用该命令控制的Java应用程序,您应该在启动它的程序中编写一个shell脚本。这只需要响应 和 动词并采取适当的操作。例如,这可能是您的:systeminit.dstartstop/etc/init.d/my-java-program

#!/bin/sh

case "$1" in
start)
    java /path/to/my/java/program.jar &
    echo $! > /var/run/my-java-program.pid
    ;;

stop)
    if [ ! -f /var/run/my-java-program.pid ]; then
        echo "my-java-program: not running"
        exit 1
    fi

    kill -TERM `cat /var/run/my-java-program.pid`
    ;;

reload)
    if [ ! -f /var/run/my-java-program.pid ]; then
        echo "my-java-program: not running"
        exit 1
    fi

    kill -HUP `cat /var/run/my-java-program.pid`
    ;;

*)
    echo "Usage: /etc/init.d/my-java-program {start|stop|reload}"
    exit 1
    ;;

esac

exit 0

您现在可以通过运行来启动您的应用程序,或者在 CentOS 上,您也可以使用服务 my-java-program start'。/etc/init.d/my-java-program start


答案 2

您无法在纯 Java 中为不同的信号定义信号处理程序,就像在本机 Unix 程序中那样。这意味着您不能遵循常见的约定,例如,让程序重新加载其配置并在 或 上执行干净关闭。SIGHUPSIGINTSIGTERM

您可以做的是定义一个关机挂钩。它们在虚拟机要关闭时运行,例如在收到 .下面是一个示例:SIGTERM

Runnable myShutdownHook = new Runnable() {
    void run() {
        System.out.println("I'm melting! What a world...");
    }
};

Runtime.getRuntime().addShutdownHook(new Thread(myShutdownHook));

推荐