linux开机启动roscore,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个关闭;

c42644aabb0a8af8c67a6f91cccfe2826cb.jpg

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

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

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

4af7991f75038570a9d4a945618b2c8b98b.jpg

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

71263216d834ff81b8fa3bc5a88bf45c888.jpg

【提示】

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的子进程。

7dbbd2f3b576dd82765d3035ca2b75fccf6.jpg

日志中的表现是:

开机脚本日志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了。

【参考】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值