Supervisor程式管理工具安裝配置

凌風發表於2018-05-07

1. 背景

1.1 概述

Supervisor 是一個用 Python 寫的程式管理工具,可以很方便的用來啟動、重啟、關閉程式(不僅僅是 Python 程式)。除了對單個程式的控制,還可以同時啟動、關閉多個程式,比如很不幸的伺服器出問題導致所有應用程式都被殺死,此時可以用 supervisor 同時啟動所有應用程式而不是一個一個地敲命令啟動。

可以說是很好的替換的系統的nohup ...... &或系統服務systemd

Supervisor相當強大,提供了很豐富的功能,不過我們可能只需要用到其中一小部分。安裝完成之後,可以編寫配置檔案,來滿足自己的需求。為了方便,我們把配置分成兩部分:supervisord(supervisor是一個C/S模型的程式,這是server端,對應的有client端:supervisorctl)和應用程式(即我們要管理的程式)。

Supervisor 只能管理在前臺執行的程式,所以如果應用程式有後臺執行的選項,需要關閉。

1.2 環境

  • Cnet OS 7
  • Python 2.X

2. 安裝

1. 使用Python的Setuptools軟體包來安裝
sudo yum -y install python-setuptools
sudo easy_install supervisor
2. 檢視安裝結果supervisord -v
3.3.4

預設安裝的版本是最新版(3.3.4)

3. 生成配置檔案supervisord.conf,如果不加路徑則預設生成到使用者目錄~/supervisord.conf
echo_supervisord_conf > supervisord.conf
4. 建立Supervisor的工作目錄
mkdir ~/developer/supervisor
mkdir ~/developer/supervisor/conf.d
mv ~/supervisord.conf ~/developer/supervisor
5. 編輯配置檔案vim ~/developer/supervisor/supervisord.conf

修改include配置,去除註釋,include中的files為自己的配置檔案存放地址。

[include]
files = /home/ling/developer/supervisor/conf.d/*.conf

conf.d為應用的配置檔案存放目錄

3. 啟動服務

sudo supervisord -c ~/developer/supervisor/supervisord.conf
1. 檢視服務
ps -ef | grep supervisord
ling      3419     1  0 02:50 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /home/ling/developer/supervisor/supervisord.conf
2. 關閉supervisor
sudo supervisorctl shutdown

4. program配置檔案

配置說明

;*為必須填寫項
;*[program:應用名稱]
[program:cat]
;*命令路徑,如果使用python啟動的程式應該為 python /home/test.py,
;不建議放入/home/user/, 對於非user使用者一般情況下是不能訪問
command=/bin/cat
;當numprocs為1時,process_name=%(program_name)s
;當numprocs>=2時,%(program_name)s_%(process_num)02d
process_name=%(program_name)s
;使用supervisor還有一個更大的好處就是,可以快速開啟多個程式,配置引數如下:
;程式數量,表示對同一個配置開啟1個執行緒。
numprocs=1
;執行目錄,若有/home/supervisor_test/test1.py
;將directory設定成/home/supervisor_test
;則command只需設定成python test1.py
;否則command必須設定成絕對執行目錄
directory=/tmp
;掩碼:--- -w- -w-, 轉換後rwx r-x w-x
umask=022
;優先順序,值越高,最後啟動,最先被關閉,預設值999
priority=999
;如果是true,當supervisor啟動時,程式將會自動啟動
autostart=true
;*自動重啟
autorestart=true
;啟動延時執行,預設1秒
startsecs=10
;啟動嘗試次數,預設3次
startretries=3
;當退出碼是0,2時,執行重啟,預設值0,2
exitcodes=0,2
;停止訊號,預設TERM
;中斷:INT(類似於Ctrl+C)(kill -INT pid),退出後會將寫檔案或日誌(推薦)
;終止:TERM(kill -TERM pid)
;掛起:HUP(kill -HUP pid),注意與Ctrl+Z/kill -stop pid不同
;從容停止:QUIT(kill -QUIT pid)
;KILL, USR1, USR2其他見命令(kill -l),說明1
stopsignal=TERM
stopwaitsecs=10
;*以root使用者執行
user=root
;有時候用 Supervisor 託管的程式還會有子程式(如 Tornado),如果只殺死主程式,子程式就可能變成孤兒程式。
;通過這兩項配置(改為true)來確保所有子程式都能正確停止,預設是false:
stopasgroup=false
killasgroup=false
;重定向,把stderr重定向到stdout,預設false;
redirect_stderr=false
;標準日誌輸出
stdout_logfile=/a/path
;標準日誌檔案大小,預設50MB
stdout_logfile_maxbytes=1MB
;標準日誌檔案大小,預設50MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
;標準日誌輸出
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
;環境變數設定
environment=A="1",B="2"
serverurl=AUTO

5. supervisorctl使用

配置檔案立即生效:

修改的配置檔案生效,設定autostart=true的程式,會自動啟動

sudo supervisorctl update

sudo supervisorctl reload
檢視後臺程式
sudo supervisorctl status
對應用的控制
  • 啟動全部應用sudo supervisorctl start all
  • 關閉全部應用sudo supervisorctl stop all
  • 重啟全部應用sudo supervisorctl restart all

all換成相應的program名稱,則就是對相應的程式進行啟動、關閉和重啟

5. 例項

以Jenkins為例啟動程式

1. 編輯配置檔案vim /home/ling/developer/supervisor/conf.d/jenkisn.conf,寫入如下內容
[program:jenkins]
command=java -jar jenkins.war --httpPort=8888
process_name=%(program_name)s
numprocs=1
directory=/home/ling/developer/jenkins
user=ling
autostart=true
autorestart=true
startsecs=10
startretries=5
redirect_stderr = true
stdout_logfile=/home/ling/developer/jenkins/logs/jenkins-out.log
stderr_logfile=/home/ling/developer/jenkins/logs/jenkins-err.log
stdout_logfile_maxbytes = 20MB
stdout_logfile_backups = 20
2. 立即生效sudo supervisorctl update
jenkins: added process group
2. 檢視結果sudo supervisorctl status
jenkins                          RUNNING   pid 4555, uptime 19:21:53

6. 故障處理

supervisord的預設配置檔案是放在/etc/supervisord.conf下面的,如果使用supervisorctl無法找到配置檔案,supervisorctl 無法獲知與supervisord 該如何通訊,使用supervisorctl時你可能會看到如下錯誤

http://localhost:9001 refused connection

處理解決辦法:

  1. 使用-c指定配置檔案位置
supervisorctl -c /path/to/supervisord.conf status
  1. 將配置檔案連結到/etc目錄下
ln -s /path/to/supervisord.conf /etc/

本文首發於凌風部落格:Supervisor程式管理工具安裝配置
作者:凌風

參考資料

相關文章