域名已变更 请手动修改文章中域名指向carlzeng.com

NAS安装及应用supervisor进程守护

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

背景/有什么用

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

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

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. 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

最后输入 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
[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

程序管理  

supervisorctl status ffmpeg

supervisorctl start ffmpeg

错误:

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                       

解决办法:

sudo unlink /tmp/supervisor.sock

相关内容

实现方法

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

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.   
supervisord -c /etc/supervisord.d/ffmpeg.conf            
Error: .ini file does not include supervisord section                                                         
For help, use /bin/supervisord -h                       

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

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

解决办法是:

运行时使用:

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

异常处理

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

解决办法:

supervisorctl restart ffmpeg

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

posted @ 2024-09-15 09:42  CarlZeng  阅读(3)  评论(0编辑  收藏  举报
域名已变更 请手动修改文章中域名指向carlzeng.com