Изящно убейте Росбага с помощью kill

Я хотел бы изящно убить экземпляр rosbag через терминал. В этом случае изящно означает, что файл rosbag не имеет суффикса .active после kill.

поэтому я делаю следующее с терминала, чтобы отправить рекомендуемый 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 остался нетронутым и был сохранен без суффикса active.

Теперь интересный вопрос, что я делаю не так в первом случае. Я думаю, что удаление файла запуска, и в данном случае уничтожение roscore, вызывает ros::shutdown(), что вызывает SIGINT во всех процессах. Но ручной способ с использованием kill, похоже, ведет себя по-другому.


person Tik0    schedule 02.06.2018    source источник
comment
У этого вопроса есть несколько дубликатов в Ответах ROS. Вы можете использовать убить rosnode или заботьтесь об уничтожении дочерних процессов в своем скрипте.   -  person luator    schedule 04.06.2018
comment
это мило! Вы бы порекомендовали закрыть мой вопрос, или я должен оставить его для справки?   -  person Tik0    schedule 05.06.2018
comment
Я думаю, что было бы полезно сохранить в качестве справочного материала, поскольку, похоже, довольно много людей не знают об ответах ROS. Вы можете сами написать краткий ответ, объяснив, как вы это исправили, в конце со ссылкой на соответствующий вопрос ROS Answers.   -  person luator    schedule 05.06.2018


Ответы (2)


Собственная обработка сигналов плохо поддерживается, и всегда лучше использовать предусмотренные ROS способы запуска и закрытия готовых узлов, чтобы API мог отслеживать. Чтобы корректно завершить узел, мы предполагаем, что узел rosbag с именем my_bag был запущен:

rosbag record -o /file/name /topic __name:=my_bag

Затем узел можно изящно убить с помощью команды rosnode kill и имени узла:

rosnode kill /my_bag

Ссылка для справки

person Tik0    schedule 05.06.2018

Как упоминалось в ссылке в ответе @Tik0, вы можете добавить ловушку в bash, чтобы поймать SIGINT (Ctrl + C) и вызвать оттуда rosnode kill, например:

#!/bin/bash
trap "rosnode kill /bagger" SIGINT
rosbag record /my_topic __name:=bagger &
roslaunch mypackage launch.launch
person simontegelid    schedule 21.08.2019