Ubuntu开机自启配置(基于service:以ROS和docker为例)

时间:2024-10-08 07:04:21

Ubuntu开机自启配置(以ROS和docker为例)

  • 前言
  • 1. service介绍
    • 1.1 service命令的基本用法
    • 1.2. service命令的常用操作
    • 1.3. service命令与systemd的兼容性
  • 2. Example之开机启动ROS
    • 2.1 创建服务单元文件
      • 2.1.1 新建`.service`文件
      • 2.1.2 编写`.service`文件
    • 2.2 重新加载systemd配置
    • 2.3 启用并启动服务
  • 3 Example之开机启动Docker
  • 4 处理依赖和环境问题
  • 5处理启动顺序问题
  • 6日志和调试


前言

在Ubuntu下,有时候希望能够开机后能够自动运行某些命令,比如ROS小车等,希望能够开机自启动,而不是每次都通过ssh等连接后再运行roslaunch xxxx 等命令。这里基于service实现。

1. service介绍

在Ubuntu中,service是一个用于管理系统服务的命令行工具,它允许用户启动、停止、重启、查看服务状态等操作。随着Ubuntu版本的更新,systemd成为了大多数Ubuntu版本(特别是Ubuntu 15.04及以后版本)的初始化系统和服务管理器,逐渐取代了旧的SysVinit和Upstart系统。

1.1 service命令的基本用法

service命令的基本语法如下:

service [选项] 服务名 [命令]
  • 1
  1. 选项:通常不需要指定,但在某些情况下可以使用选项来修改命令的行为。
  2. 服务名:要操作的服务名称,这通常对应于/etc//目录下的脚本名称(对于SysVinit和Upstart)或systemd的服务单元文件(.service)的名称。
  3. 命令:要执行的操作,如start、stop、restart、status等。

1.2. service命令的常用操作

  1. 启动服务sudo service 服务名 start
  2. 停止服务sudo service 服务名 stop
  3. 重启服务sudo service 服务名 restart
  4. 查看服务状态sudo service 服务名 status
  5. 列出所有服务:systemctl list-units --type=service

1.3. service命令与systemd的兼容性

在systemd系统中,service命令的许多操作实际上是通过调用systemd的systemctl命令来实现的。例如,当你使用sudo service 服务名 start时,systemd会查找与该服务名对应的.service文件,并使用systemctl start 服务名.service来启动服务。

2. Example之开机启动ROS

2.1 创建服务单元文件

2.1.1 新建.service文件

通过nanovim等,在/etc/systemd/system/下新建.service文件,如:

sudo nano /etc/systemd/system/
  • 1

2.1.2 编写.service文件

.service文件中,输入类似如下内容:

[Unit]  
Description=ROS Launch for Robot Base  
After=  
  
[Service]  
Type=simple  
User=<你的用户名>  
ExecStart=/bin/bash -c "source ~/catkin_ws/devel/ && roslaunch robot_base "  
Restart=on-failure  
  
[Install]  
WantedBy=
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

请确保将<你的用户名>替换为你的实际用户名。
After=确保网络服务启动后再运行你的服务。
Type=simple表示该服务将立即启动。
User=<你的用户名>确保服务以你的用户身份运行,这对于访问你的用户目录和配置是必要的。
ExecStart指定了要运行的命令。


example:

[Unit]
Description=ROS Launch for Robot Base  
After=  

[Service]
Type=simple  
User=zobot  
ExecStart=/bin/bash -c "sleep 30 && source ~/catkin_ws/devel/ && roslaunch robot_base "  
Restart=always 

[Install]
WantedBy=
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2.2 重新加载systemd配置

在创建或修改了服务单元文件后,你需要通知systemd重新加载其配置:

sudo systemctl daemon-reload
  • 1

2.3 启用并启动服务

接下来,启用服务以便在系统启动时自动运行:

sudo systemctl enable 
  • 1

然后,你可以手动启动服务来测试它是否工作正常:

sudo systemctl start 
  • 1

要检查服务的状态,可以使用:

sudo systemctl status 
  • 1

3 Example之开机启动Docker

步骤和Example之开机启动ROS相同
.service参考内容如下:

[Unit]
Description=My Docker Application
Requires=
After=

[Service]
Restart=always
ExecStart=docker run --rm -p "8080:8080" -v /home/zobot/path:/docker/path docker:zobot

[Install]
WantedBy=
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

4 处理依赖和环境问题

请注意,systemd服务可能不会加载你的用户的.bashrc或其他shell配置文件,这意味着环境变量和路径可能不会被正确设置。如果你的服务依赖于特定的环境变量或路径,你可能需要在服务单元文件的[Service]部分中明确设置它们,或者在脚本中设置它们。

例如,如果你的ROS环境依赖于特定的PYTHONPATHROS_MASTER_URI环境变量,你可以在ExecStart行之前设置它们:

[Service]  
Environment="PYTHONPATH=/path/to/python/modules"  
Environment="ROS_MASTER_URI=http://localhost:11311"  
User=<你的用户名>  
ExecStart=/bin/bash -c "source ~/catkin_ws/devel/ && roslaunch robot_base "  
Restart=on-failure
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

5处理启动顺序问题

如果你的ROS系统依赖于其他服务(如数据库、消息代理等),你可能还需要配置After=Requires=选项来确保这些服务在你的ROS服务之前启动。

6日志和调试

如果服务没有按预期工作,你可以查看systemd的日志来获取更多信息:

sudo journalctl -u 
  • 1

使用这种方法,你可以确保在Ubuntu启动时自动运行你的ROS roslaunch命令,并通过systemd进行管理和监控。