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

标签 java linux service daemon

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

service <someService> start
service <someService> stop

与使用 kill -9 <someService> 终止进程相反.正如我在之前的问题中了解到的,这就是将进程发送到 SIGTERM 之间的区别。 (前)和 SIGKILL (后)。

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

提前致谢!

最佳答案

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

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

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

如果你真的需要区分接收到的信号,或者你想支持Java通常忽略的信号(如USR1),或者你想根据信号中止关闭,那么ShutdownHook不幸的是,这对你几乎没有用处。

在 Sun JVM 中,有一种不受支持、文档记录不充分的方法来捕获信号,使用 sun.misc.SignalHandler类(class)。这可能是可移植的,尽管 IBM JVM also supports this .

例如 - 你可以连接一个信号处理程序来监听 SIGHUP重新加载您的服务器配置,它是在 init.d 中设置的脚本为 reload动词:

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

关于配置Java 应用程序以使用system 进行控制命令,你应该在 init.d 中编写一个 shell 脚本启动它的程序。这只需响应startstop动词并采取适当的行动。例如,这可能是您的 /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

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

关于java - Java 程序应该听什么,才能成为一个好的 Linux 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9179197/

相关文章:

linux - systemtap 全局变量分配失败

对增量运算符的使用感到困惑

service - 从 Service Fabric 访问 Azure Key Vault 上的 secret

java - 在服务器端表单提交处理程序中检查引用是一个好习惯吗?

java - JAXB XML 解码只看到根元素

php - : UPLOAD_ERR_CANT_write Value: 7, 文件写入磁盘失败怎么解决

c# - Windows Service通信,套接字,C#

导致ANR的android服务

Java 8 过滤器谓词参数索引越界

java - Python 与 Java 中模数实现的区别