Supervisor进程管理框架-总结、提炼和实践(190508更新)
Supervisor总览
我使用的场景
Supervisor框架图解
Supervisor是一个典型的基于客户端、服务器的进程管理框架。supervisord是一个服务(功能非常强大),supervisorctl是一个客户端程序,方便本地或远程通过XML-RPC和supervisord服务进行通信从而在整体上实现supervisor提供的进程管理服务。
supervisorctl、supervisord、supervisor和supervisord.conf的交叉理解如下
190507 4:34补充
(1)在用Supervistor管理一些用到环境变量“LD_LIBRARY_PATH”的进程时,要注意在/etc/profile尾部加上export环境变量的语句,比如我用的是:
export LD_LIBRARY_PATH=./:./lib:/home/xhj/lib:/home/xhj/lib/ffmpeg-4.1/lib:/home/xhj/Qt5.12.3/5.12.3/gcc_64/lib:$LD_LIBRARY_PATH
(2) 容易忽略的一点是“Supervistord是运行在root用户环境下”,记住这点,在Supervistord启动进程失败时分析问题时很有用。图补如下:
190508 10:34补流:
问题提出:
正常的使用supervistord和supervistorctl是在root用户权限下,当用supervistord管理的进程在运行时(我称之为启动时)会搜索并加载动态库(x.so)时,supervistord极大机率会启动该进程失败,并提示FATE错误.
分析:
在普通用户shell环境下运行一个需要在运行时加载动态库的正确实践是在~/.bashrc最后加上
export LD_LIBRARY_PATH=xx/lib
这样,该项于shell启动的app就能在xx/lib中搜索动态链接库了。同样地,在root环境下也可以通过在/etc/profile(我是ubuntu)加入
export LD_LIBRARY_PATH=xx/lib
来解决。但是,虽然supervisord的启动是通过sudo supervisord启动,但是supervisord启动管理的进程(比如process1)时,给予process1的环境不是supervisord的环境,所以上面的做法行不通(已实测)。
做并解决:
在supervisor.conf中加入管理进程所需的环境变量, 比如下面的例子(第三行是解决问题的关键):
[program:x_process]
command=/home/qzm/NetAudio_PC2/build-X_Ring-Desktop_Qt_5_12_3_GCC_64bit-Debug/x_ring
environment=LD_LIBRARY_PATH="./:./lib:/home/qzm/lib:/home/qzm/Qt5.12.3/5.12.3/gcc_64/lib" #Key
然后kill supervisord,再sudo supervisord。或者在supervisorctl的>提示符下输入stop all,然后再输入reload,重启所有进程的同时加载设置。然后之前一直处于Fail状态的进程进入running状态。
ApathyX: 亲测好用,你是我亲哥
iotDevOps: 修复了就好。
Feng402: 最强修复 哈哈 救回来了
Feng402: 我愿称你为全网最强修改,谢谢老铁
_ycyc: 还真是,好神奇