如果您只想运行一些特定于关闭的代码,则“正确的Java”处理方式不会使用信号,而是添加一个通用的“shutdown hook”,该钩子将在应用程序即将终止时运行。这是Java有时遇到的最小公分母问题之一。(由于并非所有平台都支持,因此在Java中,没有平台支持。SIGINT
SIGINT
不幸的是,您在 ShutdownHook
中没有太多上下文,但它可能仍然有用:
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run()
{
// cleanup
}
}));
如果你真的需要区分接收到的信号,或者你想支持Java通常忽略的信号(比如),或者你想根据一个信号中止关机,那么不幸的是,a对你来说基本上是无用的。USR1
ShutdownHook
有一种不受支持、文档记录不佳的方法,可以使用该类在 Sun JVM 中捕获信号。这是值得怀疑的,尽管IBM JVM似乎也支持这一点。sun.misc.SignalHandler
例如 - 您可以挂接一个信号处理程序来监听重新加载您的服务器配置,该配置在脚本中设置为谓词:SIGHUP
init.d
reload
Signal.handle(new Signal("HUP"), new SignalHandler() {
public void handle(Signal signal)
{
reloadConfiguration();
}
});
至于配置要使用该命令控制的Java应用程序,您应该在启动它的程序中编写一个shell脚本。这只需要响应 和 动词并采取适当的操作。例如,这可能是您的:system
init.d
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
您现在可以通过运行来启动您的应用程序,或者在 CentOS 上,您也可以使用服务 my-java-program start'。/etc/init.d/my-java-program start