Ruby では、最後に登録されたシグナル トラッパーが優先されることをよく知っているので、次のようにします。
Signal.trap("TERM") {puts "foo"; exit}
Signal.trap("TERM") {puts "bar"; exit}
上記のスクリプトに「kill」を発行すると、「bar」が出力されて終了します。
Ruby自体に、トラッパーにある種のスコープを強制する方法はありますか?
私の特定の状況はこれです:
名前空間付きの Signals モジュールで独自のトラッパーを定義するアプリケーションがあります (この記事では、「TERM」のみをトラップするとします)。そのコードは実行時にアプリに必要であり、その後はほとんど放置されます。
私たちが使用するサードパーティの gem (名前は付けません) は、実際には初期化メソッドで"TERM" の独自のトラッパーを登録するため、最後に初期化されたオブジェクトが、全体の "TERM" シグナルを処理するオブジェクトになります。望ましくない結果を伴うアプリケーション...
サード パーティの gem のオブジェクトに独自のトラッパーを定義することは理にかなっているかもしれませんが、アプリに影響を与えたくありません。
派手になりすぎずに、非初期化、非サードパーティのトラッパーを優先する方法を知っている人はいますか?