1、在/etc/init.d中添加启停脚本ros_daemon.bash:

  1. #!/bin/bash
  2.  
  3. ### BEGIN INIT INFO
  4. # Provides: ros_daemon.bash
  5. # Required-Start: $remote_fs $syslog
  6. # Required-Stop: $remote_fs $syslog
  7. # Default-Start: 2 3 4 5
  8. # Default-Stop: 0 1 6
  9. # Short-Description: Start daemon at boot time
  10. # Description: Enable service provided by daemon.
  11. ### END INIT INFO
  12.  
  13. script_name=$(basename $0)
  14. result_log=/var/log/${script_name}".log"
  15.  
  16. log_with_time() {
  17. local now_time=$(date +%Y/%m/%d-%H:%M:%S)
  18. echo "$now_time: $*" >>$result_log
  19. }
  20.  
  21. do_start() {
  22. source /opt/ros/indigo/setup.bash >>$result_log 2>&1
  23. /opt/ros/indigo/bin/roscore >>$result_log 2>&1 &
  24. }
  25.  
  26. do_stop() {
  27. kill $(pgrep roscore) >>$result_log 2>&1
  28. }
  29.  
  30. log_with_time "[BEGIN] $0 $*."
  31.  
  32. case "$1" in
  33. start)
  34. do_start
  35. ;;
  36. stop)
  37. do_stop
  38. ;;
  39. restart)
  40. do_stop
  41. do_start
  42. ;;
  43. *)
  44. log_with_time "Wrong parameter: $*."
  45. ;;
  46. esac
  47.  
  48. log_with_time "[END] $0 $*."
  49. 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

Ubuntu开机启动roscore服务的设置的更多相关文章

  1. Ubuntu 16.04设置rc.local开机启动命令/脚本的方法(通过update-rc.d管理Ubuntu开机启动程序/服务)

    注意:rc.local脚本里面启动的用户默认为root权限. 一.rc.local脚本 rc.local脚本是一个Ubuntu开机后会自动执行的脚本,我们可以在该脚本内添加命令行指令.该脚本位于/et ...

  2. Centos7 设置Mongodb开机启动-自定义服务

    (1).在/lib/systemd/system/目录下新建mongodb.service文件,内容如下 [Unit] Description=mongodb After=network.target ...

  3. Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动

    Linux Redis自动启动,Redis开机启动,Linux Redis设置开机启动 >>>>>>>>>>>>>> ...

  4. MTK(android init.rc) 写一个开机启动的服务

    在开机往往我们想要做一些初始化的操作,这时候可以使用init.rc文件来实现,当然书写一个开机启动的服务也需要规范的. 假设是C程序,则需要准备C程序的源码,在我的例程中是一个在开机完成(androi ...

  5. ubuntu18.04 开机启动/停止服务

    ubuntu18.04 开机启动/停止服务 一.删除一个服务 如果要删除一个服务,使用uodate-rc.d(参数-f是强制删除符号链接) update-rc.d -f apache2 remove ...

  6. 开启win10下Ubuntu子系统的SSH服务 并设置为开机启动

    Win10中安装Ubuntu子系统后默认是没有开启SSH服务的,需要手动配置开启, 1.先通过 bash 进入子系统修改配置 vi /etc/ssh/sshd_config  备注 输入i 表示键入, ...

  7. CentOS设置程序开机启动程序/服务的方法(转)

    注意:CentOS 6下基本没什么问题,CentOS 7估计不一定能行. 在CentOS系统下,主要有两种方法设置自己安装的程序开机启动. 1.把启动程序的命令添加到/etc/rc.d/rc.loca ...

  8. Centos7查询开机启动项服务

    问题描述: 最近安装了zabbix设置了一些开机启动服务 例如:zabbix-server.service,httpd.service,mariadb.service,或者系统的firework.se ...

  9. Redis之Ubuntu开机启动

    1.编译源码,生成可执行文件: 2.将生成的可执行文件拷贝到 /user/local/bin目录下,若没有x权限请加上: 3.将安装包中的 redis.conf配置文件移到/etc/redis.con ...

随机推荐

  1. pytest使用简介

    pytest是基于py unittest的一个单元测试框架,用起来比unittest简单不少,不过和unittest使用不太一样,总结如下: 格式: case的py文件名必须是test开头 def用例 ...

  2. DHCP的IP地址租约、释放

    转自:https://blog.csdn.net/wangdk789/article/details/27052505 当DHCP客户端获取到一个IP地址后,并不代表可以永久使用这个地址,而是有一个使 ...

  3. [c/c++] programming之路(30)、位运算(一)

    一.取反 ~ #include<stdio.h> #include<stdlib.h> void main(){ unsigned ; //0000 1111 char的单位是 ...

  4. 【转载】SSH协议及其应用

    原文作者:阮一峰 链接: http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html http://www.ruanyifeng.com/ ...

  5. Docker Swarm Mode 学习笔记 (基本概念)

    ​ Swarm 是使用 SwarmKit 构建的 Docker 引擎内置(原生)的集群管理和编排工具 节点 ​ 运行 Docker 的主机可以主动初始化一个 Swarm 集群 docker swarm ...

  6. HackerRank-Python攻城歷程-3.List( Find the Second Largest Number )

    if __name__ == '__main__': n = int(input()) arr = map(int, input().split()) print(sorted(list(set(ar ...

  7. python小游戏

    import time,random # 需要的数据和变量放在开头player_list = ['[狂血战士]','[森林箭手]','[光明骑士]','[独行剑客]','[格斗大师]','[枪弹专家] ...

  8. mysql自增长主键,删除数据后,将主键顺序重新排序

    用数据库的时候,难免会删除数据,会发现设置的主键增长不是按照正常顺序排列,中间有断隔比如这样. 以我这个情况举例 处理方法的原理:删除原有的自增ID,重新建立新的自增ID. ALTER TABLE ` ...

  9. C++_day06_运算符重载_智能指针

    1.只有函数运算符可以带缺省函数,其他运算符函数主要由操作符个数确定 2.解引用运算符和指针运算符 示例代码: #include <iostream> using namespace st ...

  10. linux如何查看所有的用户和组信息?

    cat /etc/passwd cat /etc/passwd查看所有的用户信息,详情如下图   [步骤二]cat /etc/passwd|grep 用户名 cat /etc/passwd|grep ...