4.6 KiB
4.6 KiB
开机自启动脚本配置操作流程
一、环境说明
- 操作系统:Ubuntu 20.04
- 目标脚本:can.sh、lidar128.sh、start.sh(pubJM.sh嵌套在start.sh中,无需单独配置)
- 启动顺序要求:can.sh → lidar128.sh → start.sh
- 配置工具:systemctl(systemd服务管理)
二、准备工作
-
确认脚本路径
记录当前脚本所在的完整路径(JingMenBus目录的绝对路径),示例:
/home/nvidia/Downloads/JingMenBus
(若主机更换,只需替换JingMenBus之前的可变路径部分) -
验证脚本可执行性
确保所有脚本具有执行权限(若已配置可跳过):cd /home/nvidia/Downloads/JingMenBus # 替换为实际路径 chmod +x can.sh lidar128.sh start.sh pubJM.sh
三、创建 systemd 服务文件
- 创建 can 服务(can.service)
sudo gedit /etc/systemd/system/can.service
粘贴以下内容(注意修改ExecStart路径):
[Unit]
Description=Configure CAN interface (can0)
After=network.target
Documentation=https://www.freedesktop.org/wiki/Software/systemd/
[Service]
Type=oneshot
# 替换为实际的can.sh路径
ExecStart=/home/nvidia/Downloads/JingMenBus/can.sh
User=root # 必须root权限(配置CAN接口和设备权限)
RemainAfterExit=yes # 确保服务状态在执行后保持为active
[Install]
WantedBy=multi-user.target
- 创建 lidar128 服务(lidar128.service)
sudo gedit /etc/systemd/system/lidar128.service
粘贴以下内容(注意修改ExecStart路径):
[Unit]
Description=Start lidar128 configuration and pcap replay
After=network.target
Documentation=https://www.freedesktop.org/wiki/Software/systemd/
[Service]
Type=simple # 因tcpreplay是持续运行的进程,需用simple类型
# 替换为实际的lidar128.sh路径
ExecStart=/home/nvidia/Downloads/JingMenBus/lidar128.sh
User=root # 需root权限(配置网络接口和vlan)
Restart=on-failure # 进程意外退出时自动重启
[Install]
WantedBy=multi-user.target
- 创建 start 服务(start.service)
sudo gedit /etc/systemd/system/start.service
粘贴以下内容(注意修改ExecStart路径和 User):
[Unit]
Description=Start ROS2 nodes
After=can.service lidar128.service network.target
Requires=can.service lidar128.service
[Service]
Type=simple
User=nvidia
WorkingDirectory=/home/nvidia/Downloads/JingMenBus
ExecStart=/home/nvidia/Downloads/JingMenBus/start.sh
Restart=on-failure
Environment=RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# 如果需要ROS_DOMAIN_ID等环境变量,也在这里加 Environment=
[Install]
WantedBy=multi-user.target
四、配置服务权限与生效
- 设置服务文件权限
sudo chmod 644 /etc/systemd/system/can.service
sudo chmod 644 /etc/systemd/system/lidar128.service
sudo chmod 644 /etc/systemd/system/start.service
重新加载 systemd 配置
sudo systemctl daemon-reload
启用开机自启动
sudo systemctl enable can.service
sudo systemctl enable lidar128.service
sudo systemctl enable start.service
五、验证配置
- 检查服务状态
sudo systemctl status can.service
sudo systemctl status lidar128.service
sudo systemctl status start.service
(正常状态应为inactive,未启动)
- 手动测试启动顺序
# 依次启动服务,验证依赖关系
sudo systemctl start can.service
sudo systemctl start lidar128.service
sudo systemctl start start.service
# 检查启动结果(若有图形界面,会看到多个gnome-terminal窗口弹出)
- 重启测试
sudo reboot
重启后验证脚本是否按顺序自动执行,可通过以下命令检查日志:
journalctl -u can.service -f # 查看can服务日志
journalctl -u lidar128.service -f # 查看lidar128服务日志
journalctl -u start.service -f # 查看start服务日志
六、注意事项
-
路径变更处理
若主机更换导致JingMenBus目录路径变化,需重新修改 3 个服务文件中的ExecStart路径,并执行:
sudo systemctl daemon-reload
-
ROS2 环境依赖
确保start.sh和pubJM.sh中source install/setup.bash的路径正确(相对于脚本所在目录),否则 ROS2 节点无法启动。
-
图形界面权限
若gnome-terminal无法启动,可能是 X11 权限问题,需确认start.service中XAUTHORITY的路径是否与当前用户匹配(替换lyq为实际用户名)。
-
服务类型说明
- can.service用oneshot(一次性执行)
- lidar128.service用simple(持续运行 tcpreplay 进程)
- start.service用oneshot(启动所有节点后完成)