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狀態。