BashのサブプロセスにSIGTERMを渡す

BashのサブプロセスにSIGTERMを渡す

次のようなBashスクリプトがあります。

#!/bin/bash
echo "Doing some initial work....";
/bin/start/main/server --nodaemon

スクリプトを実行しているbashシェルがSIGTERMシグナルを受け取ると、実行中のサーバーにSIGTERMを送信する必要があります(これによりトラップは不可能になります)。それは可能ですか?

ベストアンサー1

努力する:

#!/bin/bash 

_term() { 
  echo "Caught SIGTERM signal!" 
  kill -TERM "$child" 2>/dev/null
}

trap _term SIGTERM

echo "Doing some initial work...";
/bin/start/main/server --nodaemon &

child=$! 
wait "$child"

通常、bash子プロセスの実行中はすべてのシグナルは無視されます。としてサーバーを起動すると、&シェルジョブ制御システムの背景に配置され、$!サーバーのPID(およびと共に使用されるwait)が保存されますkill。その後、呼び出しは、wait指定されたPID(サーバー)を持つジョブが完了するのを待ちます。または放出される信号

シェルがそれを受信するとSIGTERM(またはサーバーが独立して終了したとき)、呼び出しが返されますwait(サーバーの終了コードで終了するか、信号が受信された場合は信号番号+ 128で終了します)。その後、シェルがSIGTERMを受信すると、_term終了する前にSIGTERMトラップハンドラで指定された関数を呼び出します(ここではクリーンアップを実行し、シグナルをサーバープロセスに手動で伝播しますkill)。

おすすめ記事