系统:ubuntu20.04
ros2版本:foxy
$ sudo vi /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
上面的ExecStart=/etc/rc.local start 语句会执行在/etc/下面的rc.local文件,但是这个文件在这个目录下面没有,所以新建rc.local文件
sudo touch /etc/rc.local
注意,编写完成之后,记得给文件赋予权限
sudo chmod 777 /etc/rc.local
添加一下内容,注意 #! /bin/bash 的作用位启动一个终端,会以bash形式执行文件。这里会在后台执行/home/jc/test.sh 的业务脚本
#! /bin/bash
## rc.local
bash /home/jc/test.sh &
根据上面的启动脚本在指定的/home/jc下面编写业务脚本
sudo touch /home/jc/test.sh
内容如下,echo 是我测试用的输出。source 配置环境变量,然后执行launch 文件
#! /bin/bash
echo "ni hao" >> /home/jc/jjj
export ROS_LOG_DIR=/home/jc/ros2_ws/log
source /opt/ros/foxy/setup.sh
source /home/jc/ros2_ws/install/setup.bash
ros2 launch cpp_pubsub testTalk.launch.py
echo "nihao zaici nihao" >> /home/jc/jjj
注意,编写完成业务文件后要赋予执行权限
sudo chmod 777 /home/jc/test.sh
systemctl enable rc-local.service
systemctl start rc-local.service
sudo reboot
systemctl status rc-local
我用ros2的talker节点做的测试,效果如下
注意:如果你要查看话题的发布情况,需要转到root用户下才能看到
sudo su
如下图
参考文件:(80条消息) ROS2开机程序自启动_持之以恒2016的博客-CSDN博客
(80条消息) linux+ros2 launch文件开机自启动_Zln4ever的博客-CSDN博客
Supervisor(Supervisor: A Process Control System — Supervisor 4.2.4 documentation)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
apt-get install supervisor
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
使用echo_supervisord_conf生成默认的配置文件
echo_supervisord_conf > /etc/supervisor/supervisord.conf
生成的配置文件如下
supervisord.conf
最后的[include]
部分配置作用是,将conf.d/下所有.conf结尾的项目作为子进程启动,所以要添加子进程项目,在该目录下添加.conf结尾的项目即可
在 /etc/supervisor/conf.d/文件夹下添加.conf文件
touch test.conf
注意要赋予权限
chmod 777 test.conf
内容如下,这里解释一下,program为启动的子进程的名字,之后需要启动子进程时套用。command为需要执行业务的脚本(最好写绝对目录)。stderr和stdout为执行子进程出错时的打印的日志的目录,stdout为执行子进行时正常打印的日志的目录。
还有其他的一些配置,参考:官网 或者其他人(82条消息) 使用 supervisor创建开机自启动进程_蜗牛撵大象的博客-CSDN博客
在command对应的目录下生成业务脚本
touch startnode.sh
赋予权限
chmod 777 startnode.sh
我的业务脚本内容如下 ,注意,source命令在业务脚本里面没有作用,如果你想自动获取有线网络或者无线网络的ip并配置到主从机中,最好将export 写在业务脚本中,不然不起作用。经过验证source .bashrc这个命令在业务脚本中不起作用
注意,1.要实现开机自启动ros2的脚本,需要加入export ROS_LOG_DIR目录。
2.需要配置环境变量。起初我一位只要source 之前配置号的~/.bashrc文件就可以。但是,任然提示no such file or directory.最后我直接将环境变量配置在业务脚本中,如上 export LD_LIBRARY_PATH=.......
supervisord -c /etc/supervisor/supervisord.conf
supervisorctl start test
也可以执行执行,每次修改子进行文件或业务脚本文件,只要执行reload即可
supervisorctl reload
7.1配置开机启动项
进入/lib/systemd/system目录,查看是否有supervisor.service文件,若没有创建supervisor.service文件(一般情况下都安装supervisor的时候已经自动创建好了),内容如下,system下的supervisor文件会在开机的时候自动执行,该文件执行时,会调用/etc/supervisor下的supervisord.conf.
7.2设置开机启动
chmod 766 supervisor.service
systemctl enable supervisor.service
systemctl daemon-reload
关于supervisor的他的一些命令
2)、更新新的配置到supervisord
supervisorctl update
3)、重新启动配置中的所有程序
supervisorctl reload
4)、启动某个进程(program_name=你配置中写的程序名称)
supervisorctl start program_name
5)、查看正在守候的进程
supervisorctl
6)、停止某一进程 (program_name=你配置中写的程序名称)
pervisorctl stop program_name
7)、重启某一进程 (program_name=你配置中写的程序名称)
supervisorctl restart program_name
8)、停止全部进程
supervisorctl stop all
参考连接:(81条消息) ubuntu中supervisor的安装和学习_sueong的博客-CSDN博客_ubuntu 安装supervisor
Subprocesses — Supervisor 4.2.4 documentation (supervisord.org)
(82条消息) Ubuntu下Supervisor安装、配置和使用_weixin_34001430的博客-CSDN博客