【问题标题】:How to kill a python program (which includes ROS and twisted protocol) in a clean way when Ctrl+c is pressed?按下Ctrl + c时如何以干净的方式杀死python程序(包括ROS和扭曲协议)?
【发布时间】:2016-09-12 10:32:02
【问题描述】:

我已经创建了一个 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

【问题讨论】:

    标签: python twisted ros reactor sigterm


    【解决方案1】:

    使用rospy.on_shutdown() 是一个好方法。

    基本上,在实现时,一旦请求关闭节点(如 Ctrl + C 按下),就会调用此函数。在你的情况下,你可以在这个函数中关闭你的连接,并在完全关闭之前处理你需要的任何东西(最终像reactor.close())。

    这是一个取自here的例子:

    def myhook():
      print "shutdown time!"
    
    rospy.on_shutdown(myhook)
    

    【讨论】:

      【解决方案2】:

      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)

      【讨论】:

      • rospy 钩子有效,但如果你删除 (): rospy.on_shutdown(reactor.stop)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      • 2011-05-17
      • 2012-09-23
      • 2011-02-19
      相关资源
      最近更新 更多