2016-05-16 42 views
3

我做了一個ROS節點,它使用python的扭曲協議建立與客戶端的連接。該方案是,但如預期工作時,我試圖殺死用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())。

下面是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鉤關閉扭曲的實例(不知道這將工作)

rospy.on_shutdown(reactor.stop)

或使用Python信號庫來實現一個SIGINT處理程序,可以優雅地關閉程序中的所有實例(https://docs.python.org/2/library/signal.html

+0

rospy鉤子的工作原理,但是如果刪除():''rospy.on_shutdown(reactor.stop)' –

+0

@JaviV謝謝。編輯答案 – GSalazar