当按下Ctrl + c时,如何以干净的方式杀死python程序(包括ROS和扭曲协议)?

时间:2016-05-16 15:10:53

标签: python twisted ros reactor sigterm

我创建了一个ROS节点,它使用python的扭曲协议与客户端建立连接。该程序正在按预期工作,但当我尝试使用Ctrl + c终止程序时,它显示以下错误消息:

[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

2 个答案:

答案 0 :(得分:1)

这样做的好方法是使用rospy.on_shutdown()

基本上,实现后,一旦请求节点关闭(如Ctrl + C按下),将调用此函数。在您的情况下,您可以关闭此功能内部的连接,并在完全关闭之前处理您需要的任何内容(最终像reactor.close())。

以下是here

的示例
def myhook():
  print "shutdown time!"

rospy.on_shutdown(myhook)

答案 1 :(得分: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