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

 

 

 

 

 

 

 

 

 

 

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