在 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 脚本启动它的程序。这只需响应start
和 stop
动词并采取适当的行动。例如,这可能是您的 /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/