私が持っているスクリプトでは
trap 'kill ${!}; term_handler' SIGTERM
したがって、pid $ {!}を終了すると、SIGTERMが実行されます。
答え1
または、最後に実行されたコマンドを返す必要が${!}
あります$!
。process ID (PID)
!
- 最後に実行されたバックグラウンド(async)コマンドのプロセスIDに展開されるため、最後のバックグラウンドジョブのプロセスIDが$!
含まれます。process ID (PID)
これはバックグラウンドで実行されるプログラムを表します。バックグラウンドプロセスが開始されない場合、このパラメータは設定されません。
答え2
$!
または、${!}
バックグラウンドで実行されている最後のプロセスのプロセスIDを返します。
例:wait $!
続行する前に、最後のプロセスが完了するのを待ちます。
答え3
trap 'kill ${!}; term_handler' SIGTERM
kill ${!}; term_handler
これは、シェルがSIGTERM信号を受信するとシェルコマンドが実行されることを意味します。${!}
はい特殊パラメータ$!
、どちら
($!)は、非同期コマンドとして実行されるか、bg組み込みコマンドを使用して最後にバックグラウンドに追加されたジョブのプロセスIDに展開されます。
スクリプトがSIGTERMを受信して実行term_handler
(おそらくいくつかの機能)すると、スクリプトによって開始された最後の(おそらく唯一の)バックグラウンドプロセスが終了するという効果があります。トラップが存在しない場合は、基本スクリプトが終了した後もバックグラウンドプロセスが実行され続けることがあります。
たとえば、トラップは特にSIGTERM
関連していますが、SIGINT
そうでなければSIGHUP
通常のシャットダウンはトリガされません。少なくともBashでは利用可能です
trap 'kill ${!}; term_handler' EXIT
何らかの理由でスクリプトが終了したら、トラップを実行します。