supervisord 使用指南
supervisord的安装
supervisor是一系列python脚本文件,以python package的形式管理,可以用于UNIX类系统的进程管理。
安装supervisor也相当简单,只需要用pip安装即可。
sudo pip install supervisor
但是有可能将其安装在了~/.local/lib
下,会导致systemd
自启动管理软件找不到supervisor
这个包。典型的错误为 from supervisor.supervisord import main. ERROR: No MODULE named supervisor
。
此时卸载supervisor重装,需安装在系统python的dist-packages目录下,比如通过--target
指定安装位置,确保supervisor和其他python包在一个目录(常见的如numpy等)
sudo pip install --target=/usr/local/lib/python3.8/dist-packages supervisor
和systemd一起管理自启动
启动链:systemd → supervisord → YOUR_APP
其中两个核心配置文件,/etc/systemd/system/supervisord.service
和 /etc/supervisord/supervisord.conf
。/etc/supervisord/
目录和文件自行创建
supervisord.service
为systemd启动系统常驻服务supervisord的配置文件,参考如下:
[Unit]
Description=supervisord - Supervisor process control system for UNIX;
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/bin/supervisord -c /etc/supervisord/supervisord.conf
ExecReload=/usr/local/bin/supervisorctl reload
ExecStop=/usr/local/bin/supervisorctl shutdown
[Install]
WantedBy=multi-user.target
- supervisord.conf为supervisord启动自定义程序的配置文件,参考如下:
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[supervisord]
logfile=/home/Alex/shepherd/supervisord/supervisord.log ; supervisord log file
logfile_maxbytes=50MB ; maximum size of logfile before rotation
logfile_backups=10 ; number of backed up logfiles
loglevel=info ; info, debug, warn, trace
pidfile=/var/run/supervisord.pid ; pidfile location
nodaemon=false ; run supervisord as a daemon
minfds=1024 ; number of startup file descriptors
minprocs=200 ; number of process descriptors
user=Alex ; default user
childlogdir=/home/Alex/shepherd/supervisord ; where child log files will live
[inet_http_server]
port = 127.0.0.1:9001
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[program:roscore]
command=/home/Alex/shepherd/supervisord/startup/rosl_roscore start-foreground
autostart=true
stopsignal=TERM
stopasgroup=true
stderr_logfile = /home/Alex/shepherd/supervisord/log/roscore-stderr.log
stdout_logfile = /home/Alex/shepherd/supervisord/log/roscore-stdout.log
[program:slam]
command=/home/Alex/shepherd/supervisord/startup/rosl_slam -start-foreground
autostart=true
stopsignal=TERM
stopasgroup=true
stderr_logfile = /home/Alex/shepherd/supervisord/log/slam-stderr.log
stdout_logfile = /home/Alex/shepherd/supervisord/log/slam-stdout.log
[program:sensor]
command=/home/Alex/shepherd/supervisord/startup/rosl_sensor -start-foreground
autostart=true
stopsignal=TERM
stopasgroup=true
stderr_logfile = /home/Alex/shepherd/supervisord/log/sensor-stderr.log
stdout_logfile = /home/Alex/shepherd/supervisord/log/sensor-stdout.log
- 自定义程序的启动脚本
以下文件需要chmod +x
权限
a. startup/rosl_sensor
#!/bin/bash
sudo chmod 777 /dev/spidev3.0
source /opt/ros/noetic/setup.bash
cd /home/Alex/shepherd/sensor_bringup
source /home/Alex/shepherd/sensor_bringup/ROS/devel/setup.bash
export ROS_HOME=/home/Alex/.ros
rosrun vi_driver vi_publisher 61 &
PID=$!
wait "$PID"
在shell脚本中想要免密sudo可以sudo visudo
,追加一行:
YOUR_USERNAME ALL=(ALL) NOPASSWD: /bin/chmod
b. startup/rosl_slam
#!/bin/bash
source /opt/ros/noetic/setup.bash
source /home/Alex/shepherd/vinsfusion_ws/devel/setup.bash
export ROS_HOME=/home/Alex/.ros
rosrun vins vins_node /home/Alex/shepherd/vinsfusion_ws/src/VINS-Fusion/config/sensor/stereo_imu_config.yaml &
rosrun loop_fusion loop_fusion_node /home/Alex/shepherd/vinsfusion_ws/src/VINS-Fusion/config/sensor/stereo_imu_config.yaml &
PID=$!
wait "$PID"
c. startup/rosl_roscore
#!/bin/bash
source /opt/ros/noetic/setup.bash
export ROS_HOME=/home/Alex/.ros
roscore
PID=$!
wait "$PID"