参考1:https://www.corvin.cn/707.html
参考2:https://blog.csdn.net/csdnhuaong/article/details/80962588
参考3:https://www.cnblogs.com/klcf0220/p/14150902.html
树莓派4B安装ubuntu18.04,无桌面系统,ROS系统版本为melodic。为了实现开机运行launch,在网上找了多种实现方式,最终选择了比较合适的service方法做一下记录。
目录
1. ros_startup.service、ros_start、ros_stop、ros_restart脚本及权限
1.2 ros_start、ros_stop、ros_restart
2. bash脚本config_service.sh执行配置
3. uninstall_ros_service.sh卸载service文件
一、创建脚本软件包
首先~/catkin_ws/src目录下已有编译成功的软件包,在当前目录下创建一个新的软件包用于存放脚本:
~/catkin_ws/src$ catkin_create_pkg auto_startup
生成CMakeLists.txt和package.xml文件。
二、创建脚本目录及文件
1. ros_startup.service、ros_start、ros_stop、ros_restart脚本及权限
进入刚刚创建的auto_startup目录:
~/catkin_ws/src$ cd auto_startup
在当前目录下创建脚本并添加执行权限:
~/catkin_ws/src/auto_startup/scripts$ touch ros_startup.service ros_start ros_stop ros_restart
~/catkin_ws/src/auto_startup/scripts$ chmod +x ros_start ros_stop ros_restart # 执行权限
1.1 ros_startup.service
ros_startup.service文件为自定义的服务,内容如下:
[Unit]
Description=powerOn startup ros
[Service]
Type=simple
Restart=always
RestartSec=30
ExecStart=/usr/sbin/ros_start
ExecStop=/usr/sbin/ros_stop
ExecRestart=/usr/sbin/ros_restart
[Install]
WantedBy=multi-user.target
service主要包括Unit,Service,Install三个部分:
Unit: 服务的类型描述。
Service: 服务的关键部分,需要配置的一些关键参数:
(1)Type=simple:表明这个服务主要由 ExecStart 设置的程序来启动,启动后常驻于内存中。这个simple是默认的参数,除了simple外还可以设置为oneShot,该参数与simple类似,区别在于这个ExecStart执行的命令执行完成后就退出了,不会常驻在内存中。还可以设置为idel,该参数与 simple 类似,意思是要执行这个服务必须要所有的工作都顺利执行完毕后才会执行,这类的服务通常是开机到最后才执行即可的服务。
(2)Restart=always:表明该服务具备重启功能,如果服务意外关闭后会一直尝试重新启动。
(3)RestartSec=30:表明服务在意外关闭后,经过30秒后再次重新尝试启动该服务。
(4)ExecStart=/usr/sbin/ros_start:表明服务启动时需要执行的命令,后面就是执行的命令所在路径。
(5)ExecStop=/usr/sbin/ros_stop:当需要停止该服务时需要执行的命令,后面是命令的路径。
(6)ExecStop=/usr/sbin/ros_restart:当服务需要重新启动时需要执行的命令,后面是命令的路径。
Install: 需要将该unit安装到哪个target上。
1.2 ros_start、ros_stop、ros_restart
(1)ros_start脚本,是服务启动时需要执行的命令:
#!/bin/bash
source /opt/ros/melodic/setup.bash
source /home/ubuntu/catkin_ws/devel/setup.bash
roslaunch package_name roslaunch_name.launch
exit 0
(2)ros_stop脚本,是需要停止服务时执行的命令:
#!/bin/bash
source /opt/ros/melodic/setup.bash
source /home/ubuntu/catkin_ws/devel/setup.bash
for i in $(rosnode list);do
rosnode kill $i;
done
killall roslaunch
exit 0
(3)ros_restart脚本,是需要重启服务时执行的命令:
#!/bin/bash
/usr/sbin/ros_stop
sleep 3
/usr/sbin/ros_start
exit 0
2. bash脚本config_service.sh执行配置
编写好service和相应的执行脚本后,需要将其放到指定的目录下,由于需要执行的命令较多,可以编写一个bash脚本来执行配置的命令,该脚本仍然放在scripts目录下,文件命名为config_service.sh,脚本代码如下:
#!/bin/bash
sudo cp ros_start /usr/sbin/
sudo cp ros_stop /usr/sbin/
sudo cp ros_restart /usr/sbin/
sudo cp ros_startup.service /lib/systemd/system/
sudo systemctl enable ros_startup.service
exit 0
sudo systemctl enable ros_startup.service是为了使该服务生效,启用该服务。当为该脚本通过chmod +x config_service.sh来增加执行权限后就可以来执行该脚本配置service了,脚本执行如下:
~/catkin_ws/src/auto_startup/scripts$ ./config_service.sh #执行脚本
~/catkin_ws/src/auto_startup/scripts$ systemctl is-enabled ros_startup.service #查看是否已经启用该服务,返回enable说明服务已经挂载在系统服务上
三、systemctl命令对自定义服务进行操作
1. systemctl命令
sudo systemctl stop ros_startup.service # 停止launch
sudo systemctl start ros_startup.service # 启动launch
sudo systemctl restart ros_startup.service # 重新启动launch
sudo systemctl disable ros_startup.service # 禁止服务在开机时启动
sudo systemctl enable ros_startup.service # 开机启动服务
2. Journalctl日志输出
enable了自定义的服务后,服务会在后台一直运行,但是我们却不知道该服务在后台如何运行的,因为看不到任何日志输出,如果想查看服务运行的相关日志就需要使用journalctl标准日志服务来查看,Systemd通过其标准日志服务Journald将其管理的所有后台进程打印到到std:out(即控制台)的输出重定向到了日志文件。日志文件是二进制格式的,因此必须使用特定的工具才能查看。
Journald提供了配套的程序Journalctl用于处理日志内容,Journalctl的使用非常简单,默认不带任何参数的时候会输出系统和所有后台进程的混合日志,常用的参数有--dmesg用于查看内核输出的日志,--system用于查看系统输出的日志,--unit加上Unit的名字来指定输出特定Unit的日志,例如我们想查看自定义服务ros_startup.service的日志输出,可以使用如下命令:
sudo journalctl --unit ros_startup.service
3. uninstall_ros_service.sh卸载service文件
如果想卸载相关的service文件,需要将放置在相应目录中的脚本和service文件删除即可,可以编写个uninstall_ros_service.sh脚本来完成:
#!/bin/bash
/usr/sbin/ros_stop
sudo systemctl disable ros_startup.service
sudo rm /usr/sbin/ros_start
sudo rm /usr/sbin/ros_stop
sudo rm /usr/sbin/ros_restart
sudo rm /lib/systemd/system/ros_startup.service
exit 0
4. service指令操作
~/catkin_ws/src/auto_startup/scripts$ touch uninstall_ros_service.sh # 创建脚本文件
~/catkin_ws/src/auto_startup/scripts$ vim uninstall_ros_service.sh
~/catkin_ws/src/auto_startup/scripts$ chmod +x uninstall_ros_service.sh # 增加执行权限
~/catkin_ws/src/auto_startup/scripts$ ./uninstall_ros_service.sh # 执行卸载自定义service的脚本
~/catkin_ws/src/auto_startup/scripts$ ./config_service.sh # 重新执行脚本启用服务
~/catkin_ws/src/auto_startup/scripts$ systemctl is-enabled ros_startup.service # 查看服务启用状态,返回enabled
~/catkin_ws/src/auto_startup/scripts$ sudo systemctl start ros_startup.service # 启动launch文件
~/catkin_ws/src/auto_startup/scripts$ sudo journalctl --unit ros_startup.service # 查看服务的日志输出
当执行uninstall_ros_service.sh脚本卸载自定义service后,我们已经无法执行start和stop相关操作了,如果想再次启用自定义服务只要重新执行启用的脚本即可。