Ubuntu开机启动roscore服务的设置

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个关闭;

 

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

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

其中,2345016表示运行级别,如下:

 

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

 

 

【提示】

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

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

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

 

3、python roscorerosoutpython rosmaster的关系:

roscorerosoutpython rosmaster的父进程。

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

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

 

日志中的表现是:

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

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

 

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://stackoverflow.com/questions/24258698/missing-lsb-information-start-up-shell-script

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

 

posted on 2018-01-19 09:58  _bob  阅读(3945)  评论(0编辑  收藏  举报