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