Java - 以编程方式设置SIGTERM的退出代码

时间:2013-01-03 18:08:05

标签: java shutdown

情况:我有一个保持活动的shell脚本,它会在关闭时重新启动应用程序。但是,如果通过SIGTERMSIGINTkillCtrl+C等)关闭应用程序,即关闭挂钩,我不希望它执行此操作。但是当我从关闭挂钩退出时,我无法设置退出代码,从而与keep-alive脚本进行通信,因为调用exit是非法的。

来自exit的Javadocs:

  

如果在虚拟机开始关闭序列后调用此方法,则如果正在运行shutdown hooks,则此方法将无限期地阻塞。如果已经运行了关闭挂钩并且已启用了退出终结,则此方法如果状态为非零,则使用给定的状态代码暂停虚拟机;否则,它无限期地阻止。

这可能吗?

3 个答案:

答案 0 :(得分:4)

如果该过程已被信号杀死,则$?变量will be set to 128 + signal

bash$ sleep 3;echo $?
0

bash$ sleep 3;echo $?
^C
130

此处130128 + SIGINT

答案 1 :(得分:0)

在变量中获取进程的PID并使用内置wait:如果进程已被信号终止,则返回代码wait将为128 +信号编号。< / p>

#
# Note: output from shell trimmed
#
# Launch cat in the background, capture the PID
$ cat & PIDTOCHECK=$!
$ echo $PIDTOCHECK
27764
#
# Call wait a first time: the program is halted waiting for input (SIGTTIN)
#
$ wait $PIDTOCHECK ; echo $?
149
#
# Now kill cat, and call wait again
#
$ kill %1
$ wait $PIDTOCHECK ; echo $?
143

答案 2 :(得分:0)

这就是我要做的:

Runtime.getRuntime().halt(0);

请注意,这将立即退出程序,因此您需要在最后一个关闭挂钩完成后再执行此操作。