• 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

     

  • 相关阅读:
    mac给文件夹添加权限命令,mac设置文件夹权限
    idea自动生成Entity类的get方法和set方法
    mac连接linux服务器远程
    phpstorm中设置文件保存后自动上传FTP
    cmd删除文件夹或删除文件
    SpringBoot封装增删改查接口
    修改 Docker 的默认存储路径
    ES6ES11 20152020
    js开发中可用的位运算
    Git 修改最近一次的提交注释 包括已push和未push
  • 原文地址:https://www.cnblogs.com/xiaochou/p/roscore_daemon.html
Copyright © 2020-2023  润新知