2014-01-15 4 views
5

いくつかのプロジェクトでは、rake serverのようなレーキタスクを用意して、必要な手段でそのアプリケーションにサービスを提供したいと考えています。ここでは一例です:Rakeの長時間実行可能なシェルコマンドは正常に中断できますか?

task :server do 
    %x{bundle exec rackup -p 1234} 
end 

これは動作しますが、私はそれを停止する準備ができていたときに、Ctrl+cを押すと、正常にシャットダウンしません。それはrake aborted!というレーキタスク自体を中断し、スタックトレースを与えます。場合によっては、Ctrl+cを2回実行する必要があります。

Signal.trapと書いて、これをもっとうまく中断することができました。簡単な方法がありますか?

+0

あなたのケースに当てはまるが、私のレーキタスクで同様の問題が発生しているかどうかはわかりません。問題は特定のコードブロックで例外を捕まえていたことです。それはまた、Ctrl + Cを飲み込んでいたようです。私がStandardErrorをキャッチするとすぐに、Ctrl + Cがそのまま動作し始めました。 – Renra

答えて

9
trap('SIGINT') { puts "Your message"; exit } 

これはトリックを行う必要があります。

タスクレベルでtrapを追加することもできます。

+0

素敵で簡単!優雅に終わるためには、打ち切りなしで 'exit'を使うほうが良いのではないでしょうか? –

+0

@ NathanLongあなたの「優雅な」定義に依存します。人間の目では同じです:P – robertodecurnex

+1

With exit! '"出口ハンドラは実行されません。 "したがって、 'at_exit do'ブロックは無視されます。私はむしろそれらを実行させると思います。とにかく、ありがとう! –

関連する問題