Ubuntu开机启动roscore服务的设置

时间:2020-12-07 21:18:00

1、在/etc/init.d中添加启停脚本ros_daemon.bash:

#!/bin/bash

### BEGIN INIT INFO
# Provides: ros_daemon.bash
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO script_name=$(basename $0)
result_log=/var/log/${script_name}".log" log_with_time() {
local now_time=$(date +%Y/%m/%d-%H:%M:%S)
echo "$now_time: $*" >>$result_log
} do_start() {
source /opt/ros/indigo/setup.bash >>$result_log 2>&1
/opt/ros/indigo/bin/roscore >>$result_log 2>&1 &
} do_stop() {
kill $(pgrep roscore) >>$result_log 2>&1
} log_with_time "[BEGIN] $0 $*." case "$1" in
start)
do_start
;;
stop)
do_stop
;;
restart)
do_stop
do_start
;;
*)
log_with_time "Wrong parameter: $*."
;;
esac log_with_time "[END] $0 $*."
exit 0

2、Ubuntu自启服务的设置:

1、删除自启动服务:

sudo update-rc.d ros_daemon.bash remove

如果/etc/init.d/ros_daemon.bash仍然存在,那么需要添加-f选项。

sudo update-rc.d -f ros_daemon.bash remove

【注意】

上述命令删除的都仅仅是链接,而不会删除/etc/init.d/文件夹中的脚本文件。

2、添加开机自启动服务:

update-rc.d ros_daemon.bash defaults 90 10

表示开机时第90个启动,关机时第10个关闭;

Ubuntu开机启动roscore服务的设置

上面的命令和下面显式的指定启动级别是一样的:

update-rc.d ros_daemon.bash start 90 2 3 4 5 . stop 10 0 1 6 .

其中,2345和016表示运行级别,如下:

Ubuntu开机启动roscore服务的设置

我们可以通过runlevel查看当前系统的运行状态:

Ubuntu开机启动roscore服务的设置

【提示】

1、使用-n选项,如sudo update-rc.d -n ros_daemon.bash remove 可以模拟该命令的输出,但是并不实际执行;

2、man update-rc.d 可以查看详细手册;

3、sudo service --status-all可以查看当前注册的所有服务列表。

3、python roscore和rosout、python rosmaster的关系:

roscore是rosout、python rosmaster的父进程。

3.1 如果1、步骤,在脚本中使用roscore &

开机执行开机脚本S*ros_daemon.bash start;调用结束后脚本退出,那么roscore成为孤儿进程(被init收养),rosout、python rosmaster仍然是roscore的子进程。

Ubuntu开机启动roscore服务的设置

日志中的表现是:

开机脚本日志S*ros_daemon.bash.log中有BEGIN和END语句,但是开机过程中没有roscore的输出日志;直到关机时,roscore被关机脚本kill $(pgrep roscore)关闭,roscore的输出写入S*ros_daemon.bash.log;即日志中的记录顺序与脚本的执行顺序不一致了;

关机脚本日志K*ros_daemon.bash.log中有BEGIN和END语句,正常。

3.2、如果1、步骤中,使用的是roscore不带&

那么该脚本(父进程ros_daemon.bash start)不会退出,直到关机时系统执行:

1、关掉该父进程(子进程roscore也被关闭,且roscore下面的语句不再执行);

2、执行ros_daemon.bash stop,会报错:已经没有roscore了。

日志中的表现是:

S*ros_daemon.bash.log中没有END语句;

K*ros_daemon.bash.log中有错误日志:已经没有roscore了。

【参考】

1、https://*.com/questions/24258698/missing-lsb-information-start-up-shell-script

2、http://www.cnblogs.com/hbhzsysutengfei/p/ubuntu-runlevel-autostart-service.html