gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:15:10 34 4
gpt4 key购买 nike

在 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/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com