シェルが閉じたときのSIGTERM操作の原因

シェルが閉じたときのSIGTERM操作の原因

シェルスクリプトのtrap 'kill $(jobs -p)' EXIT転送で見ることができます。信号用語シェルが閉じられると、シェルに対するすべてのアクションが実行されます。 bashスクリプトを実行すると、新しいbashシェルが起動します。たとえば、このユーザーは./trap_test.shPIDを使用してbashインスタンスを実行して作成します98959

 | |     |-+= 05624 user /usr/local/bin/bash
 | |     | \-+= 98959 user /bin/bash ./trap_test.sh
 | |     |   \--- 98960 user sleep 10

親シェルが閉じても、どのような状況でジョブを実行できますか?上記の例では、PID 98959を終了すると、PID 98960も自動的に終了します。trap 'kill $(jobs -p)' EXITシェル自体が閉じられると、すべての子プロセスが終了する必要があるため、私には役に立たないようです。

答え1

nohupを使用して子プロセスが開始されると、nohupコマンドの目的である親シェルの終了/終了後も保持されます。

もう1つの可能性は、スクリプトまたはプロセスがシャットダウンシグナル(明らかにシャットダウン-9ではない)を処理し、それを無視する場合、バックグラウンドジョブで開始すると、現在のシェルがシャットダウンしたときにシャットダウンされないことです。

例:

 #!/bin/bash

 function trap_handler
 {
     echo "SORRY! I am not going down MUAHAHA!"
 }

 trap trap_handler SIGINT SIGTERM SIGHUP 

 while true
 do
      sleep 60
 done

したがって、バックグラウンドジョブで開始して終了しようとすると、次のことが発生します。

 $ ps -ef | grep test &
 $ jobs
 [1]+  Running                 ./test_trap.sh &
 $ kill %1
 $ Terminated
 SORRY! I am not going down MUAHAH!

 $ jobs
 [1]+  Running                 ./test_trap.sh &

次に、他の端末でプロセスを監視し、スクリプトを起動した端末/シェルを終了すると、何が起こるかを見てみましょう。

 $ pstree -clap 26163
 bash,26163
  └─test_trap.sh,26175 ./test_trap.sh
       └─sleep,26183 60
 ## exited the original terminal window with exit
 $ pstree -clap 26163
 $ 
 $ pstree -clap 26175
 test_trap.sh,26175 ./test_trap.sh
   └─sleep,26185 60

端末プロセスはもう存在しませんが、開始された test_trap.sh のプロセス ID に対して pstree を実行すると、そのプロセスとそのサブプロセスがまだ存在します。

関連情報