いくつかのrakeタスクを連続して呼び出すbashスクリプトがあります。このスクリプトは、継続的インテグレーションサーバーによって呼び出されます。問題は、統合サーバーが(スクリプトにSIGTERMを送信して)タスクを強制終了した場合、プロセスツリー全体を強制終了できないことです。たとえば、Rakeが並列機能を使用して一連のrspecテストを実行している場合、スクリプトとトップレベルのrakeコマンドを強制終了できますが、必然的に一部のスレッドは続行されます。
これまで、bashスクリプト内で「trap」コマンドを使用するさまざまな方法を試しました。「kill-90」を使用して現在のプロセスグループを強制終了するなど、pstreeですべてのサブプロセスを検索しようとしました。ただし、rakeタスクの実行中にスクリプトが強制終了されると、トラップがバイパスされるようです。私が知る限り、Rake、またはおそらくRubyのスレッドライブラリは、プロセスグループに対して奇妙なことをしたり、トラップを妨害したりします。
スクリプトがrakeタスクの途中にない場合は、SIGTERMを正しくトラップし、「Received SIGTERM」をエコーして、すべての子孫を強制終了します。
Rakeが親プロセス(bashスクリプト)のトラップステートメントに干渉する可能性はありますか?