情况:我有一个保持活动的shell脚本,它会在关闭时重新启动应用程序。但是,如果通过SIGTERM
或SIGINT
(kill
,Ctrl+C
等)关闭应用程序,即关闭挂钩,我不希望它执行此操作。但是当我从关闭挂钩退出时,我无法设置退出代码,从而与keep-alive脚本进行通信,因为调用exit
是非法的。
来自exit
的Javadocs:
如果在虚拟机开始关闭序列后调用此方法,则如果正在运行shutdown hooks,则此方法将无限期地阻塞。如果已经运行了关闭挂钩并且已启用了退出终结,则此方法如果状态为非零,则使用给定的状态代码暂停虚拟机;否则,它无限期地阻止。
这可能吗?
答案 0 :(得分:4)
如果该过程已被信号杀死,则$?
变量will be set to 128 + signal
:
bash$ sleep 3;echo $?
0
bash$ sleep 3;echo $?
^C
130
此处130
为128 + 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);
请注意,这将立即退出程序,因此您需要在最后一个关闭挂钩完成后再执行此操作。