我有以下bash脚本,它在后台运行一个进程并等待它完成。如果它在它之间终止,它应该在终止之前杀死它的子进程。
此脚本在docker容器中运行。
_term() {
echo "SHELL: Caught SIGTERM signal, propagating to the child"
kill -TERM "$child" 2>/dev/null
}
trap _term SIGTERM
java -jar RunningProcessWithJMX.jar & # in background
child=$!
wait "$child" # Line #10
trap - SIGTERM # Line #11
wait "$child" # Line #12
echo "SHELL: Task finished."
我能够理解除了陷阱之外的这个脚本并等待第11行,#12。以下是我的疑惑 -
如果action为' - ',shell应将每个条件重置为默认值 值。
答案 0 :(得分:1)
这确实是个好问题。现在看下面: -
trap - SIGTERM # Line #11
当您将此信号发送到进程时,它不会立即自行终止。一旦进程收到此信号,它就可以对某些行为进行操作,这些行为在它自杀之前至关重要,可能需要一些时间才能完成。在Java中,有一个方法调用attachShutDownHook
,我们就这样实现。
private void attachShutDownHook() {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override public void run() {
System.out.println("Received signal to stop the application");
System.out.println("Shuting down the application....");
//here your codes what you want to do at this situation
}
}
);
}
现在,当您执行trap
命令时,此方法将调用java应用程序。 Java虚拟机一旦收到上述trap
命令或命令,如kill -8
将在当前运行的Java应用程序中调用此方法。
wait "$child" # Line #12
你肯定要等到孩子完成最后一个任务列表才能完成attachShutDownHook
方法。
希望这会有所帮助。