目录
引言
在项目开发环境中很多功能我们希望做成开机自启的形式,比如开机自启roscore,或者开机自启某个节点。本文介绍使systemd工具实现开机自启动的功能,同时在文章最后也罗列了我在配置开机自启的时候遇到的一些坑。
使用systemd 实现 Ubuntu 开机自启功能相比其他方式具有以下几个优势:
-
统一管理:systemd 是现代 Linux 发行版的默认 init 系统,它统一管理系统和服务的启动,简化了服务管理的流程。使用 systemd 可以统一配置和管理自启动服务,而不需要依赖不同的工具和脚本。
-
依赖管理:systemd 具有强大的依赖管理功能,可以定义服务之间的依赖关系。这样可以确保服务按照正确的顺序启动和停止,避免因依赖问题导致的服务启动失败。
-
并行启动:systemd 支持并行启动服务,这可以显著缩短系统启动时间。相比传统的串行启动方式,systemd 可以更快地完成系统启动。
-
服务监控:systemd 提供了服务的状态监控和自动重启功能。如果某个服务崩溃或意外停止,systemd 可以自动重新启动该服务,确保服务的持续运行。
-
标准化配置:systemd 使用单一的配置文件格式(*.service 文件),配置语法统一且易读。相比传统的 init 脚本,systemd 配置文件更加直观且易于维护。
-
日志管理:systemd 集成了 journald 日志系统,能够集中管理和查看系统和服务的日志。这样可以方便地追踪和调试服务启动过程中的问题。
-
灵活性:systemd 提供了丰富的工具和选项,可以灵活地配置服务的启动条件、运行环境、资源限制等,满足各种复杂的启动需求。
综合以上优势,使用 systemd 实现 Ubuntu 开机自启功能不仅更加高效和可靠,还能简化系统管理和维护工作。
功能1:开机自启动roscore
1.检查环境变量:
确认你已经正确设置了 ROS 环境变量。你可以在终端中手动运行以下命令,确保 roscore 能正常启动:
source /opt/ros/noetic/setup.bash
/opt/ros/noetic/bin/roscore
如果上述命令能够正常启动 roscore,说明你的 ROS 安装是正常的。
2.添加服务文件:
在/etc/systemd/system目录下新建start_ros.service 文件。修改该文件:
bash sudo nano /etc/systemd/system/start_ros.service
修改后的服务文件内容如下:
[Unit]
Description=ROS core service
After=network.target
[Service]
Type=simple
Environment="HOME=/home/your_username"
WorkingDirectory=/home/your_username
ExecStart=/bin/bash -c 'source /opt/ros/noetic/setup.bash && /opt/ros/noetic/bin/roscore'
Restart=on-failure
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
这个 service 文件定义了一个 systemd 服务,用于在启动时运行 ROS(Robot Operating System)的核心服务 roscore。下面是对文件内容的详细解释:
[Unit] 部分
[Unit]
Description=ROS core service
After=network.target
Description=ROS core service
:提供一个简短的描述,说明这是一个 ROS 核心服务。After=network.target
:指定此服务应在network.target
之后启动。这意味着在网络服务启动后再启动此服务,确保网络已准备好。
[Service] 部分
[Service]
Type=simple
Environment="HOME=/home/your_username"
WorkingDirectory=/home/your_username
ExecStart=/bin/bash -c 'source /opt/ros/noetic/setup.bash && /opt/ros/noetic/bin/roscore'
Restart=on-failure
StandardOutput=journal
StandardError=journal
Type=simple
:表示这是一个简单的服务,systemd 会认为启动命令(ExecStart
)一旦执行,此服务就已启动。Environment="HOME=/home/your_username"
:设置环境变量HOME
为/home/your_username
。这可能是为了确保 ROS 使用正确的用户环境。WorkingDirectory=/home/your_username
:指定服务的工作目录。服务将在此目录中运行。ExecStart=/bin/bash -c 'source /opt/ros/noetic/setup.bash && /opt/ros/noetic/bin/roscore'
:指定服务的启动命令。这里使用bash
来运行一个命令,该命令首先source
了 ROS 的设置脚本,然后启动roscore
。Restart=on-failure
:指定如果服务失败(退出码非 0),则自动重启服务。这有助于提高服务的可靠性。StandardOutput=journal
和StandardError=journal
:将服务的标准输出和标准错误重定向到 systemd 日志(journald)。这样可以方便地查看和调试服务日志。
[Install] 部分
[Install]
WantedBy=multi-user.target
WantedBy=multi-user.target
:指定在多用户模式下启动此服务。这意味着服务将在系统达到多用户模式(常见的运行级别)时启动。
3. 重新加载并重新启动服务:
bash sudo systemctl daemon-reload sudo systemctl restart start_ros.service
4.检查服务状态和日志:
确认服务状态:
bash sudo systemctl status start_ros.service
查看日志以确保没有其他错误:
bash sudo journalctl -u start_ros.service -b
功能2:开启自启动一个launch文件
步骤一:创建启动脚本
-
创建脚本文件
打开终端并运行以下命令来创建一个新的脚本文件:
sudo nano /home/your_username/ros_startup.sh
-
添加脚本内容
在文件中添加以下内容:
#!/bin/bash
source /path/to/your/workspace/devel/setup.bash
roslaunch your_package ros_auto_start.launch
请确保将/path/to/your/workspace替换为你的工作空间路径,将your_package替换为你的ROS包名。
-
保存并退出
保存文件并退出编辑器(在nano中按Ctrl+X,然后按Y确认保存,最后按Enter)。
-
给脚本添加执行权限
运行以下命令来给脚本添加执行权限:
sudo chmod +x /home/your_username/ros_startup.sh
步骤二:创建系统服务
-
创建系统服务文件
打开终端并运行以下命令来创建一个新的服务文件:
sudo nano /etc/systemd/system/ros_auto_start.service
-
添加服务内容
在文件中添加以下内容:
[Unit]
Description=Start ROS Auto Start Launch File
After=network.target
[Service]
ExecStart=/home/your_username/ros_startup.sh
User=your_username
Restart=on-failure
[Install]
WantedBy=multi-user.target
请确保将"your_username"替换为你的用户名。
-
重新加载系统服务
运行以下命令来重新加载系统服务配置:
sudo systemctl daemon-reload
-
启用并启动服务
运行以下命令来启用并启动该服务:
sudo systemctl enable ros_auto_start.service
sudo systemctl start ros_auto_start.service
坑1:按照上面设置并没有起作用
我仔细检查发现是因为我的service文件中没有将“User=your_username”中的"your_username"替换为自己的用户名。修改之后就可以开机自启了。
坑2:设置开机自启动launch之后,发现ROS主从机配置不好用了。
这个是因为的ROS主从机配置是写在.bashrc中的,但是.bashrc中的东西是开启新终端才会被执行,引起刚开机时我的脚本执行的时候是没有配置主从机ip的,所以就会不好用,解决方法也很简单,在自启脚本中添加主从机配置即可。下面的例子是配置为ros主机,如果要配置为从机,方法类似。
#!/bin/bash
#ros主机master配置
export ROS_MASTER_URI=http://192.168.41.1:11311
export ROS_IP=192.168.41.1 //主机ip
source /path/to/your/workspace/devel/setup.bash
roslaunch your_package ros_auto_start.launch