4

情况:我有一个保持活动状态的 shell 脚本,它会在应用程序关闭时重新启动它。SIGTERM但是,如果应用程序通过或SIGINT( kill,Ctrl+C等) (即关闭挂钩)关闭,我不希望它这样做。但是,我无法设置退出代码,因此在从关闭挂钩退出时与保持活动脚本通信,因为调用exit是非法的。

从 Javadocs 获取exit

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

这可能吗?

4

3 回答 3

4

如果进程已被信号终止,则$?变量将设置为128 + signal

bash$ sleep 3;echo $?
0

bash$ sleep 3;echo $?
^C
130

这里,130128 + SIGINT

于 2013-01-03T18:13:12.607 回答
0

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

#
# 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
于 2013-01-03T18:15:56.377 回答
0

这就是我所做的:

Runtime.getRuntime().halt(0);

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

于 2020-06-30T08:06:02.430 回答