如何设置ubuntu20.04系统开机自启(使用systemd方法)

引言

在项目开发环境中很多功能我们希望做成开机自启的形式,比如开机自启roscore,或者开机自启某个节点。本文介绍使systemd工具实现开机自启动的功能,同时在文章最后也罗列了我在配置开机自启的时候遇到的一些坑。

使用systemd 实现 Ubuntu 开机自启功能相比其他方式具有以下几个优势:

  1. 统一管理:systemd 是现代 Linux 发行版的默认 init 系统,它统一管理系统和服务的启动,简化了服务管理的流程。使用 systemd 可以统一配置和管理自启动服务,而不需要依赖不同的工具和脚本。

  2. 依赖管理:systemd 具有强大的依赖管理功能,可以定义服务之间的依赖关系。这样可以确保服务按照正确的顺序启动和停止,避免因依赖问题导致的服务启动失败。

  3. 并行启动:systemd 支持并行启动服务,这可以显著缩短系统启动时间。相比传统的串行启动方式,systemd 可以更快地完成系统启动。

  4. 服务监控:systemd 提供了服务的状态监控和自动重启功能。如果某个服务崩溃或意外停止,systemd 可以自动重新启动该服务,确保服务的持续运行。

  5. 标准化配置:systemd 使用单一的配置文件格式(*.service 文件),配置语法统一且易读。相比传统的 init 脚本,systemd 配置文件更加直观且易于维护。

  6. 日志管理:systemd 集成了 journald 日志系统,能够集中管理和查看系统和服务的日志。这样可以方便地追踪和调试服务启动过程中的问题。

  7. 灵活性: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=journalStandardError=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文件

步骤一:创建启动脚本

  1. 创建脚本文件

    打开终端并运行以下命令来创建一个新的脚本文件:

sudo nano /home/your_username/ros_startup.sh
  1. 添加脚本内容

    在文件中添加以下内容:

#!/bin/bash
source /path/to/your/workspace/devel/setup.bash
roslaunch your_package ros_auto_start.launch

请确保将/path/to/your/workspace替换为你的工作空间路径,将your_package替换为你的ROS包名。

  1. 保存并退出

    保存文件并退出编辑器(在nano中按Ctrl+X,然后按Y确认保存,最后按Enter)。

  2. 给脚本添加执行权限

    运行以下命令来给脚本添加执行权限:

sudo chmod +x /home/your_username/ros_startup.sh

步骤二:创建系统服务

  1. 创建系统服务文件

    打开终端并运行以下命令来创建一个新的服务文件:

sudo nano /etc/systemd/system/ros_auto_start.service
  1. 添加服务内容

    在文件中添加以下内容:

[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"替换为你的用户名。

  1. 重新加载系统服务

    运行以下命令来重新加载系统服务配置:

sudo systemctl daemon-reload
  1. 启用并启动服务

    运行以下命令来启用并启动该服务:

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
  • 28
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值