我做了一个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
发布于 2016-05-17 03:18:41
要做到这一点,一个好方法是使用rospy.on_shutdown()
。
基本上,在实现时,一旦请求关闭节点(就像按下Ctrl +C键一样),就会调用此函数。在您的例子中,您可以关闭此函数内部的连接,并在完全关闭之前处理您需要的任何东西(最终像reactor.close()
一样)。
下面是取自here的一个例子:
def myhook():
print "shutdown time!"
rospy.on_shutdown(myhook)
发布于 2016-05-17 03:19:31
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)
https://stackoverflow.com/questions/37257238
复制相似问题