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
- 选项:通常不需要指定,但在某些情况下可以使用选项来修改命令的行为。
- 服务名:要操作的服务名称,这通常对应于/etc//目录下的脚本名称(对于SysVinit和Upstart)或systemd的服务单元文件(.service)的名称。
- 命令:要执行的操作,如start、stop、restart、status等。
1.2. service命令的常用操作
-
启动服务:
sudo service 服务名 start
-
停止服务:
sudo service 服务名 stop
-
重启服务:
sudo service 服务名 restart
-
查看服务状态:
sudo service 服务名 status
-
列出所有服务:
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
文件
通过nano
,vim
等,在/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环境依赖于特定的PYTHONPATH
或ROS_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
进行管理和监控。