sim*_*mao 8 java bash jvm signals
我使用以下代码在java中捕获INT信号:
Signal.handle(new Signal("INT"), new SignalHandler () {
public void handle(Signal sig) {
log.warn("Received SIGINT signal. Will teardown.");
task.tearDown();
// Force exit anyway
System.exit(1);
}
});
Run Code Online (Sandbox Code Playgroud)
当我java -jar file.jar
用来启动我的应用程序时,我可以捕获随附的信号kill -INT PID
.
如果我打电话java -jar file.jar &
(jvm在后台运行),我无法捕捉发送的信号kill -INT
.
有任何想法吗?
谢谢.
对我有用。你确定你正在杀死正确的pid吗?在 Unix 上,您可以使用$!
来获取最后启动的进程的 pid。
$ java -jar file.jar &
[1] 25573
$ kill -INT $!
Received SIGINT signal. Will teardown.
Run Code Online (Sandbox Code Playgroud)
更新:
如果您通过 shell 脚本在后台启动它,操作系统将创建一个新的进程组,该进程组将不受键盘生成的信号(例如 SIGINT)的影响。只有进程组ID与当前终端进程组ID匹配的进程才能接收到这些信号。
因此,尝试在当前终端的进程组中运行它,如下所示:
. ./script.sh
Run Code Online (Sandbox Code Playgroud)
然后您就可以发送 SIGINT。
有关作业控制的更多信息请参见此处。