2011-12-26 11 views
3

Ctrl + Cを押してすべての接続を手動で終了するときと、クライアントがサーバーから切断するときを区別する良い方法はありますか?両方ともunbindメソッドと呼ばれるようです。EventMachineを使用してCtrl + Cと通常のバインドを区別する方法を教えてください。

Ctrl + Cを使用して手動でシャットダウンすると、オンラインになっているためバックアップを開始したときに接続しているピアと再接続しようとしている可能性があります。クライアントが私との接続を切断した場合、私はまだ立ち上がっているのにシャットダウンしてしまいますので、しばらくは再接続したくないです。

答えて

3

をKILL

interrupted = false 

trap("INT") { interrupted = true } 


if interrupted 
    # CTRL+C pressed 
end 
# rest of program 

同様の方法EventMachineのGoogleグループから回答を得ることができました。

http://groups.google.com/group/eventmachine/browse_thread/thread/92d92d7d101e933c

基本的に、あなたは(原子炉がシャットダウンし、何の次の目盛りがないので)、Ctrl + Cキーで行うにはしたくないだろう余分なものを実行するためにEM.next_tickを使用することができます。ここで

は私のアンバインドする方法です:

def unbind 
    # temporarily disconnect in a way that would reconnect next time 
    @peer.update_attribute :connected, false 

    # really disconnect, this is not called on ctrl-c 
    EM.next_tick do 
     @peer.destroy 
    end 
    end 
+0

本当に素敵です!それは私が何度も自分に尋ねた質問ですが、本当の答えを探すのに悩まされることはありませんでした。 – Schmurfy

1

CTRL + Cは、あなたがTRAPそれをすることができ、実行中のプロセスへの信号であり、それは次のようになります:あなたは私をトラップHUPのような複数の信号を、缶や

+0

は 'unbind'メソッド内でこのトラップの作業を行い、またはそれはすでにそれまでに閉じ込められてきましたか?助けてくれてありがとう! –

+0

https://github.com/eventmachine/eventmachine/blob/master/lib/em/connection.rb#L199 ここではソースで見つかったことがあるので、アンバインドの動作をオーバーライドできるようです。 –

+0

えええええええええええええええええええええええええええええええええええええええええ。 Eventmachineは既に 'unbind'を入力する前にctrl-cを閉じ込めています。私も 'close_connection'をオーバーライドしようとしましたが、eventmachineはこれを直接呼び出さないように見えます - あなた自身ができますが、デフォルトではできません。 –

関連する問題