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 .
其中,2345和016表示運行級別,如下:

我們可以通過runlevel查看當前系統的運行狀態:

【提示】
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的子進程。

日志中的表現是:
開機腳本日志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://stackoverflow.com/questions/24258698/missing-lsb-information-start-up-shell-script
2、http://www.cnblogs.com/hbhzsysutengfei/p/ubuntu-runlevel-autostart-service.html
