進程管理程序supervisor使用實踐

1. Supervisor介紹

Supervisor是用Python開發的一套通用的進程管理程序,能將一個普通的命令行進程變爲後臺daemon,實現如下功能:

  1. 監控進程狀態,異常退出時能自動重啓。它是通過fork/exec的方式把這些被管理的進程當作supervisor的子進程來啓動,這樣只要在supervisor的配置文件中,把要管理的進程的可執行文件的路徑寫進去即可。
  2. 實現當子進程掛掉的時候,父進程可以準確獲取子進程掛掉的信息的,可以選擇是否自己啓動和報警。
  3. 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程序。

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