1

いくつかのrakeタスクを連続して呼び出すbashスクリプトがあります。このスクリプトは、継続的インテグレーションサーバーによって呼び出されます。問題は、統合サーバーが(スクリプトにSIGTERMを送信して)タスクを強制終了した場合、プロセスツリー全体を強制終了できないことです。たとえば、Rakeが並列機能を使用して一連のrspecテストを実行している場合、スクリプトとトップレベルのrakeコマンドを強制終了できますが、必然的に一部のスレッドは続行されます。

これまで、bashスクリプト内で「trap」コマンドを使用するさまざまな方法を試しました。「kill-90」を使用して現在のプロセスグループを強制終了するなど、pstreeですべてのサブプロセスを検索しようとしました。ただし、rakeタスクの実行中にスクリプトが強制終了されると、トラップがバイパスされるようです。私が知る限り、Rake、またはおそらくRubyのスレッドライブラリは、プロセスグループに対して奇妙なことをしたり、トラップを妨害したりします。

スクリプトがrakeタスクの途中にない場合は、SIGTERMを正しくトラップし、「Received SIGTERM」をエコーし​​て、すべての子孫を強制終了します。

Rakeが親プロセス(bashスクリプト)のトラップステートメントに干渉する可能性はありますか?

4

1 に答える 1

1

Bash は、プロセス グループ全体がシグナルを受信したと想定するため、現在実行中のコマンドが終了するのを待って、何をすべきかを判断します (詳細情報)。コマンドが終了するまで、トラップは実行されません。

コマンドが終了するのを待ちたくない場合は、代わりに使用できます

trap 'kill $!' TERM
job &
wait $!

waitシェルが SIGTERM を受け取るとすぐに終了し、トラップがすぐに実行されます。

于 2013-01-29T00:45:00.313 に答える