最近要写实现一个ubuntu 20.04上的ros-noetic的一些功能,然后这些功能需要开机自启动,查阅了很多博客和网上的资料,最终能够实现开机自启动的功能,过去很多功能实现了,就过去了,但是如果下次再碰到这些问题,就又要从新找资料,所以还是养成记录的习惯是比较好的,因此记录下这个过程。
Ubuntu20.04实现开机自启动,可以通过两种方法。第一种是写服务的方法,第二种是使用rc.local文件设置自启动(其本质也是使用rc-local.service服务)。
第一种方法如下:
下面是添加一个服务的步骤,在ubuntu20.04设置服务自启动的最佳推荐的方法是创建一个systemd服务文件,配置好执行的服务,使用Systemd服务管理器来添加和管理服务:
1 创建我们需要开机自启动的脚本,如start.sh,其内容如下,我的脚本功能是启动一个gazebo的节点
脚本的开头一定要是:!#/bin/bash
结尾要是:exit 0
其中:source /opt/ros/noetic/setup.bash加入系统变量,
source /home/sun/dev/catkin_ws/devel/setup.sh是将自己的工作环境变量加入:
2. 我们写的sh脚本必须是可运行的,进行下面的设置:
sudo chmod +x /home/gzf/gzfProjects/rosproiects/demon07 ws/devel/setup.sh
3.写一个service,在/etc/systemd/system/路径下创建一个服务,服务的名字一定要和脚本的名字一致。内容如下:
其中,After表示服务何时启动,After=network.service 表示网络连接完成后,启动我们的服务;ExecStart表示我们的脚本(步骤1中的start.sh)的路径;Restart=always,表示服务退出了总是重启;WantedBy默认填default.target。
注意,ExecStart=*.sh 这里一定不能用 ~/ 来代替/home/$USER
4.开启服务
sudo chmod 777 /etc/systemd/system/start.service //修改服务的权限,使其能够被systemd读取
sudo systemctl daemon-reload //然后重新加载daemon
sudo systemctl start start.service //启动新创建的服务
sudo systemctl enable start.service //我们可以通过以下命令将服务设置为开机启动,这样启动后或者系统重启后都可以实现自动启动start.service服务。
可以使用命令:sudo systemctl status start.service 查看当前的服务。
sudo systemctl stop start.service 停止服务
sudo systemctl disable start.service 禁用服务
sudo systemctl restart start.service 重启服务
第二种是使用rc.local,其本质也是使用rc-local.service服务。
1.编写sh脚本
#!/bin/bash
source /opt/ros/noetic/setup.bash
source /home/gzf/gzfProjects/rosprojects/demon07_ws/devel/setup.sh
roslaunch urdf_gazebo01 demon02_car.launch
exit 0
2.在/etc/路径下创建rc.local,
3.在rc.local下输入以下的内容:
cd /home/gzf
/bin/su -gzf -c “/home/gzf/start.sh &”
#查看rc-local服务状态,启动服务查看启动状态,如果这里启动失败了需要回头更改rc.local文件看看是不是有语法错误或者执行的脚本有没有问题
sudo systemctl status rc-local(使用 sudo systemctl status rc-local.service 查看 rc-local 服务的状态, 显示 loaded 和 enabled。)
输入以下命令,加载服务、停止rc-local.setvice,在其启用rc-local.service,重新加载rc-local.service即可。
sudo systemctl daemon reload
sudo systemctl disable rc-local.service
sudo systemctl enable rc-local.service
sudo systemctl restart rc-local.service
4. 重启电脑
输入以下指令查看有没有roscore的线程
sudo netstat -tunpl | grep 11311*
输入以下指令查看 gazebo的线程
ps -ef | grep gazebo *