次のような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
)。