我想通过终端优雅地杀死rosbag
个实例。
在这种情况下,优雅地表示rosbag
文件在kill之后没有后缀 .active 。
所以我在终端上执行以下操作,将建议的SIGINT
发送到rosbag:
$ rosbag record /some/topic &
$ RPID=$!
$ # do some stuff
$ kill -2 $RPID
不幸的是,这个包仍然是活动的,并且可能发生并非一切都存储在磁盘上。 但是,如果我将rosbag放入启动文件中,它似乎有效:
$ roslaunch rosbag_record.launch &
$ LPID=$!
$ # do some stuff
$ kill -2 $LPID
现在,rosbag保持不变,并且存储时没有活动后缀。
现在有趣的问题是,在第一种情况下我做错了什么。
我虽然杀了一个启动文件,,在这种情况下杀死了roscore ,但会引发一个ros::shutdown()
,这会在所有进程中导致SIGINT
。
但是使用kill
的手动方式似乎有不同的行为。
答案 0 :(得分:4)
原生信号处理并未得到很好的支持,使用ROS的启动和关闭完成节点的预期方法总是更好,这样API就可以跟踪。
为了优雅地结束节点,我们假设已启动名为my_bag
的rosbag节点:
rosbag record -o /file/name /topic __name:=my_bag
然后,使用rosnode kill
命令和节点名称正常杀死节点kann:
rosnode kill /my_bag
<强> Link for reference 强>
答案 1 :(得分:0)
如@ Tik0答案中的参考中所述,您可以在bash中添加陷阱以捕获SIGINT(Ctrl + C)并从那里调用rosnode kill
,例如:
#!/bin/bash
trap "rosnode kill /bagger" SIGINT
rosbag record /my_topic __name:=bagger &
roslaunch mypackage launch.launch