進程管理程序supervisor使用實踐
1. Supervisor介紹
Supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,實現如下功能:
- 監控進程狀態,異常退出時能自動重啓。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啓動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去即可。
- 實現當子進程掛掉的時候,父進程可以準確獲取子進程掛掉的信息的,可以選擇是否自己啓動和報警。
- supervisor還提供了一個功能,可以爲supervisord或者每個子進程,設置一個非root的user,這個user就可以管理它對應的進程。
(來源:Supervisor使用詳解)
2. 安裝和配置
pip3 install supervisor
安裝完成後,我們在/etc/
下創建supervisor
目錄,然後使用下述命令創建服務端配置文件:
cd /etc/
mkdir supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
然後創建進程配置管理目錄/etc/supervisor/conf.d/
和示例進程配置文件test.conf:
mkdir conf.d/
vim test.conf
將以下內容複製到test.ini
文件中:
; 設置進程的名稱,使用 supervisorctl 來管理進程時需要使用該進程名
[program:test_py]
command=python3 /root/test_supervisor.py
;numprocs=1 ; 默認爲1
;process_name=%(program_name)s ; 默認爲 %(program_name)s,即 [program:x] 中的 x
directory=/root/ ; 執行 command 之前,先切換到工作目錄
user=root ; 使用 root 用戶來啓動該進程
; 程序崩潰時自動重啓,重啓次數是有限制的,默認爲3次
autorestart=true
redirect_stderr=true ; 重定向輸出的日誌
stdout_logfile = /var/log/supervisord/test_py.log
loglevel=info
查看supervisord目錄的結構:
.
├── conf.d
│ └── test.ini
└── supervisord.conf
其中supervisord.conf
是服務端配置文件,conf.d
目錄用於存放管理進行的配置文件。
這裏我們創建一個示例示例配置文件test.ini
。
、;
這裏是註釋的符號,[program:test_py] 是進程名稱,主要是command,用來配置程序啓動的命令。
3. 啓動supervisor
現在可以啓動supervisor,如果你修改了ip、port、username、password,需要把配置文件中的;[inet_http_server]
內容取消註釋;同時請修改test.ini中的目錄爲你係統中存在的目錄。
這裏爲了能讓公網訪問服務,該部分修改爲以下內容:
[inet_http_server]
port=0.0.0.0:9001
最後兩行,讓supervisor讀取指定目錄下的ini文件作爲配置文件:
[include]
files = /etc/supervisor/conf.d/*.ini
這裏別忘記我們創建的[program:test_py]
示例進程配置文件,我們這裏創建一個test_supervisor.py
文件作爲我們第一個受supervisor管理的進程,將test_supervisor.py
放在/root/下,內容如下:
import time
while True:
print(10)
time.sleep(30)
運行以下命令啓動supervisor:
supervisord -c /etc/supervisor/supervisord.conf
訪問host:9001
打開下面的頁面:
4. supervisor常用命令
supervisorctl update # 更新配置
supervisorctl reload # 重啓配置中的所有程序
supervisorctl status # 查看管理的程序狀態
supervisorctl shutdown # 停止supervisor
supervisorctl restart <application name> # 重啓指定應用
supervisorctl stop <application name> # 停止指定應用
supervisorctl start <application name> # 啓動指定應用
supervisorctl restart all ;重啓所有應用
supervisorctl stop all ;停止所有應用
supervisorctl start all ;啓動所有應用
或者執行supervisorctl進入命令行,然後交互的執行supervisorctl後的指令。
5. 問題集合
5.1 Unlinking stale socket /tmp/supervisor.sock
使用unlink /tmp/supervisor.sock
來解決。
$ supervisord -c /etc/supervisor/supervisord.conf
Unlinking stale socket /tmp/supervisor.sock
$ unlink /tmp/supervisor.sock
5.2 使用nohup不輸出日誌
是因爲supervisor無法監控nohup程序。