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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM