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状态

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章