シェルスクリプトのtrap 'kill $(jobs -p)' EXIT
転送で見ることができます。信号用語シェルが閉じられると、シェルに対するすべてのアクションが実行されます。 bashスクリプトを実行すると、新しいbashシェルが起動します。たとえば、このユーザーは./trap_test.sh
PIDを使用して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 を実行すると、そのプロセスとそのサブプロセスがまだ存在します。