NAS安装及应用supervisor进程守护

学会安装并使用supervisor进程守护, 再也不用担心进程无故消失/退出

背景/有什么用

NAS中进程守护的实践应用(Debian中也一样)

前文讲了在群晖NAS的后台中运行如下命令来实现推流

1
nohup ffmpeg -re -i "rtsp://admin:d****@192.168.6.126:554/cam/realmonitor?channel=1&subtype=1" -c copy -f flv -y rtmp://192.168.6.116:1935/live/livestream 1>/dev/null 2>&1 &

推流 将摄像头的视频音频流 推到SRS服务器端(做为视频内容的输入口)

可是这个命令几度优化后(比如nohup让其进入后台运行, 不输出日志等), 还存在一个弊端: 运行几天以后, 这个进程会自动消失/退出. 不知道进程是如何退出的, 但结论就是自动退出并消失了.

想起可以使用一些进程守护的解决方案, 比如:

1
2
3
4
1. supervisor 进程守护

2. pm2 实现的“进程守护
PM2是开源的基于Nodejs的进程管理器,包括守护进程,监控,日志的一整套完整的功能,基本是Nodejs应用程序不二的守护进程选择

Supervisor安装与配置(linux/unix进程管理工具) Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

使用2天的感受: 非常给力! 推流进程一直持续着, 再也不用手动去启动ffmpeg.

supervisorctl status输出了守护的进程信息

怎么用

先安装pip
wget https://bootstrap.pypa.io/get-pip.py
python3 get-pip.py

1
2
3
4
5
6
最后输入 pip3 -V验证是否成功!

pip3 -V
pip 24.2 from /usr/lib/python3.8/site-packages/pip (python 3.8)

pip3 install supervisor

配置Supervisor

  1. mddir /etc/supervisord.d
    1. 创建管理目录
  2. cat /etc/supervisord.conf
    1. 显示默认的配置文件内容(如下所示)
  3. 然后复制模版(默认配置文件内容)以后去新建一个自己的守护的进程, 就是在这个模版的结尾 添加这样的章节 [program:ffmpeg]
    1. 其中ffmpeg就是程序唯一名称, 也就是命名一个特定的指令
  4. 最后使用命令运行 supervisord -c /etc/supervisord.d/ffmpeg.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=5MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=1 ; # of main logfile backups; 0 means none, default 10
loglevel=warn ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
silent=false ; no logs to stdout if true; default false
minfds=102 ; min. avail startup file descriptors; default 1024
minprocs=20 ; min. avail process descriptors;default 200

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket

[program:ffmpeg] #程序唯一名称
directory=/bin/ #程序路径
command=ffmpeg -re -i "rtsp://admin:d****@192.168.6.126:554/cam/realmonitor?channel=1&subtype=1" -c copy -f flv -y rtmp://192.168.6.116:1935/live/livestream #运行程序的命令
autostart=true #是否在supervisord启动后tomcat也启动
startsecs=10 #启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true #程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启;意思为如果不是supervisord来关闭的该进程则认为不正当关闭,supervisord会再次把该进程给启动起来,只能使用该supervisorctl来进行关闭、启动、重启操作
startretries=3 #启动失败自动重试次数,默认是3
user=root #用哪个用户启动进程,默认是root
priority=999 #进程启动优先级,默认999,假如Supervisord需要管理多个进程,那么值小的优先启动
stopsignal=INT
redirect_stderr=true #把stderr重定向到stdout标准输出,默认false
stdout_logfile_maxbytes=200MB #stdout标准输出日志文件大小,日志文件大小到200M后则进行切割,切割后的日志文件会标示为catalina.out1,catalina.out2,catalina.out3...,默认50MB
stdout_logfile_backups = 1 #stdout标准输出日志文件备份数,保存100个200MB的日志文件,超过100个后老的将被删除,默认为10保存10个
stdout_logfile=/volume2/KingchuxingSSD512G/Maintenance/catalina.out #标准日志输出位置,如果输出位置不存在则会启动失败
stopasgroup=false #默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false #默认为false,向进程组发送kill信号,包括子进程

#supervisord启动
supervisord -c /etc/supervisord.d/ffmpeg.conf

#启动supervisord进程,我们在配置文件中设置了 autostart=true 参数,在supervisord启动的时候 ffmpeg也随之启动

ps -ef|grep ffmpeg

程序管理  

1
2
3
supervisorctl status ffmpeg

supervisorctl start ffmpeg

错误:

1
2
3
supervisord -c /etc/supervisord.d/ffmpeg.conf            
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
For help, use /bin/supervisord -h

解决办法:

1
sudo unlink /tmp/supervisor.sock

相关内容

实现方法

命令以及日志输出(实例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
wget  https://bootstrap.pypa.io/get-pip.py


root@DS918:/etc# python3 get-pip.py
Collecting pip
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection bro
ken by 'NewConnectionError(': Failed
to establish a new connection: [Errno -3] Temporary failure in name resolution')': /packages/d4/55/90db48d85f7
689ec6f81c0db0622d704306c5284850383c090e6c7195a5c/pip-24.2-py3-none-any.whl.metadata
Downloading pip-24.2-py3-none-any.whl.metadata (3.6 kB)
Collecting setuptools
Downloading setuptools-72.1.0-py3-none-any.whl.metadata (6.6 kB)
Collecting wheel
Downloading wheel-0.44.0-py3-none-any.whl.metadata (2.3 kB)
Downloading pip-24.2-py3-none-any.whl (1.8 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.8/1.8 MB 40.6 kB/s eta 0:00:00
Downloading setuptools-72.1.0-py3-none-any.whl (2.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 2.3/2.3 MB 38.3 kB/s eta 0:00:00
Downloading wheel-0.44.0-py3-none-any.whl (67 kB)
Installing collected packages: wheel, setuptools, pip
Successfully installed pip-24.2 setuptools-72.1.0 wheel-0.44.0
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing an
d want to suppress this warning.


root@DS918:/etc# pip3 -V
pip 24.2 from /usr/lib/python3.8/site-packages/pip (python 3.8)


root@DS918:/etc# pip3 install supervisor
Collecting supervisor
Downloading supervisor-4.2.5-py2.py3-none-any.whl.metadata (86 kB)
Requirement already satisfied: setuptools in /usr/lib/python3.8/site-packages (from supervisor) (72.1.0)
Downloading supervisor-4.2.5-py2.py3-none-any.whl (319 kB)
Installing collected packages: supervisor
Successfully installed supervisor-4.2.5
WARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment i
nstead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.
1
2
3
supervisord -c /etc/supervisord.d/ffmpeg.conf            
Error: .ini file does not include supervisord section
For help, use /bin/supervisord -h

错误解决办法: 在配置文件中添加supervisord section/章节

1
2
supervisorctl start ffmpeg                               
unix:///tmp/supervisor.sock no such file

解决办法是:

运行时使用:

1
supervisord -c /etc/supervisord.d/ffmpeg.conf
1
2
3
vi /etc/supervisord.d/ffmpeg.conf   
1. 使用默认的模版
2. 在最后面添加一个章节 [program:ffmpeg]

异常处理

发现推流没有正常, 查询进程status, 一切正常; 期间的外网IP变化多次, 网络也不稳定了DDNS错误(重启了猫以后, wan3没有拨号成功, 导致所有的网络服务都失去正确的ip, ddns无法灵活动态获取成功拨号了的虚拟wan口IP, 怎么解决?)

解决办法:

supervisorctl restart ffmpeg

1
2
3
4
5
root@DS:~# supervisorctl status ffmpeg
ffmpeg RUNNING pid 11310, uptime 19 days, 6:37:39
root@DS:~# supervisorctl restart ffmpeg
ffmpeg: stopped
ffmpeg: started

这样重启后, 推流马上正常了, 很方便, 直接了当略过了ffmpeg里面的细节.

推流异常

后来发现不是这个supervisor进程守护故障, 由于中继K2P将上游的K2P路由器无故攻击下线(由于WIFI的信道变化, 而下游K2P用正确的密码去不停连接错误信道的上游K2P路由器), 导致上游的K2P路由器变成无法上网的状态

这样的外围出错, 导致了上游K2P路由器无法上网而使TP1Z摄像头的断开了网络(它变成无法上网), 我不明白无法上网, 应该是并且导致它无法连接到SRS本地服务器, 这样就导致推流失败了.

当我找到推流异常问题的根源后, 通过 WIFI远程无线中继之K2P刷机Padavan无线桥接功能 来锁定信道后, 让上游的K2P路由器工作正常, 然后需要手动重新使用以下命令:

supervisorctl restart ffmpeg

来重新开启正常的推流. 通过这类外围故障, 更加印证了这个supervisor进程守护是可靠的.

然而进程虽然一直正常存在, 但不代表它一直正常按预期完成指定的任务!

灵感来源

Supervisor安装与配置二

动态公网IP 和 SRS-CarlZeng