为什么要多加一对陷阱并等待

时间:2018-03-26 11:04:28

标签: bash shell docker-container

我有以下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。以下是我的疑惑 -

  1. 根据trap的手册页,第11行正在重置SIGTERM上的操作。但是如果在docker容器中运行它并且进程持续时间短/持续时间很长,那么这个步骤是否有任何优势?
  2.   

    如果action为' - ',shell应将每个条件重置为默认值          值。

    1. 据我所知,执行控制不会到达第11行,直到第10行产生的过程完成/终止。有人可以帮助我理解如果在第12行添加另一个等待有什么优势吗?目前,每当我在docker容器之外运行此脚本时,它都会报告该子项已被终止。

1 个答案:

答案 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方法。

希望这会有所帮助。