2016-05-16 22 views
3

私は、Pythonのツイストプロトコルを使用してクライアントとの接続を確立するROSノードを作成しました。期待通りのプログラムが動作しているが、私はCtrlキー+ cを使用してプログラムを強制終了しようとすると、エラーメッセージ、次の表示:Ctrl + cを押したときに、Pythonプログラム(ROSとツイストプロトコルを含む)をきれいに殺すには?

は[server_send_command_ver3-4]

をSIGTERMためにエスカレート私は以下の私のコードの一部が含まれていたが:

if __name__ == '__main__': 
    try: 
    #node initialization 
    rospy.init_node('listen', anonymous = True) 

    #publisher to publish message to clientconnection to display connection status on GUI 
    connect = rospy.Publisher("status", String, queue_size = 10) 
    connect.publish(" Lost Connection") 

    #twisted protocol and listen at port 80 
    factory = Factory() 
    factory.protocol = NewFactory 
    factory.clients = [] 
    reactor.listenTCP(80, factory) 
    reactor.run() 

    except rospy.ROSInterruptException: 
    pass 

答えて

1

rospy.on_shutdown()を使用するとよいでしょう。

基本的に実装されると、ノードシャットダウンが要求されると(Ctrl + Cキーのように)この関数が呼び出されます。あなたの場合、この関数内で接続を閉じて、完全シャットダウン(最終的にはreactor.close()のようなsth)の前に必要なものを処理することができます。

ここhereから取った例です:

def myhook(): 
    print "shutdown time!" 

rospy.on_shutdown(myhook) 
1

rospyが既に信号のハンドラ(http://wiki.ros.org/rospy/Overview/Initialization%20and%20Shutdown)を実装し、CTRL + C(SIGINT)だけで罰金を処理する必要があります。

しかし、あなたはねじれたインスタンスを実行しており、reactor.run()はブロッキングコールです。送信している信号がねじれたスレッドを閉じていません。プログラムが反応を起こしていないので、rospyはSIGINTをSIGTERMにエスカレートしてプログラムを強制的に終了させます。あなたは

rospy.on_shutdown(reactor.stop)

または実装するためのpython信号ライブラリを使用して(それが動作するかどうかわからない)ねじれたインスタンスを閉じるためにrospyにフックを実装することができますいずれか

優雅にあなたのプログラムを閉じることができるようにします(https://docs.python.org/2/library/signal.html

+0

rospyフックが動作しますが、(): 'rospy.on_shutdown(reactor.stop) 'を削除すると、 –

+0

@JaviVありがとうございます。回答を編集しました – GSalazar

関連する問題