supervisord進程管理服務

簡介

官網 http://supervisord.org/
supervisor是一個容許用戶監視和控制在linux操做系統的進程數量的客戶端/服務器系統。由python語言編寫,用以監控服務器的運行,發現問題能當即自動預警及自動重啓等功能。supervisor還要求管理的程序是非daemon程序,supervisord會幫你把它轉成daemon程序。前端

組件

  • supervisord

服務端,他負責在他本身的進程下起一個子進程,相應來自客戶端的命令,重啓崩潰或異常退出的子進程,輸出相關日誌,針對於子進程活躍期間的時間進行生成和管理
配置文件位置: /etc/supervisord.conf 注意配置合理權限python

  • supervisorctl

命令行客戶端,有supervisord提供的一個shell-like接口,經過它,用戶能夠鏈接到不一樣的supervisorctl進程,查看,起停子進程,列出正在運行的子進程。經過TCP進行交互,提供認證,在[supervisorctl]段進行統一的配置linux

  • web server

supervisorctl的web管理界面,經過訪問http://localhost:9001/來管理子進程狀態,[inet_http_server]這段進行配置nginx

安裝

前提條件是要有python環境,linux通常自帶python環境,這裏以centOS爲例。web

  • yum安裝
yum install -y supervisor

啓動

systemctl start supervisor

配置文件解析

生成配置文件:
echo_supervisord_conf > /tmp/supervisord.conf
通常yum安裝後配置文件默認位置是/etc/supervisor/supervisord.conf。其中註釋是以分號開頭shell

[unix_http_server]   #這段是經過socket文件啓動的web server,這個要有,由於命令行supervisorctl是經過這個實現的。
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123
[inet_http_server] #經過網絡端口啓動的web server
port = 127.0.0.1:9001
username = user
password = 123
[supervisord]   #這塊是服務配置
logfile = /tmp/supervisord.log   日誌文件
logfile_maxbytes = 50MB   日誌文件最大size
logfile_backups=10  日誌輪詢下備份數
loglevel = info 日誌級別
pidfile = /tmp/supervisord.pid  pid文件位置
nodaemon = false  若是是true,supervisor將在前端啓動
minfds = 1024   supervisord啓動成功的最小文件描述符數
minprocs = 200 supervisord啓動成功的最小進程描述符數
umask = 022
user = chrism   啓動用戶,這塊要注意,這個用戶要有相應的目錄權限
identifier = supervisor supervisor進程的 identifier字符串,用戶RPC協議接口
directory = /tmp  當supervisord服務daemonizes時,切換到這個目錄,可用這個%(here)s變量來擴展到整個配置文件
nocleanup = true  禁止supervisord在啓動時間清空任何存在的AUTO子日誌文件
childlogdir = /tmp AUTO自日誌文件目錄
strip_ansi = false 除去在子日誌文件中全部的 ANSI轉義序列
environment = KEY1="value1",KEY2="value2" 一個鍵/值的列表,一個環境變量吧?
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor String used as supervisorctl prompt.做爲supervisorctl提示字符串。

管理進程配置

配置文件位置:/etc/supervisor/conf.d/
通常有以下配置項:瀏覽器

process_name=%(program_name)s #進程名稱,默認是程序名稱
command 啓動程序命令
numprocs=1 #進程數量
directory=/tmp #路徑
umask=022 #掩碼
priority=999 #優先級,越大被開起的越早
autorestart=true #自動重啓
startsecs=10 #啓動等待時間(秒)
startretries=3 #啓動重試次數
stopsignal=TERM #關閉信號
stopwaitsecs=10 #關閉前等待時間
user=chrism #監控用戶權限
redirect_stderr=false #重定向報錯輸出
stdout_logfile=/a/path #輸入重定向爲日誌
stdout_logfile_maxbytes=1MB #日誌大小
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 #系統URL

示例

爲了更好的展現,我這邊寫了一個簡單的服務。下面的具體的代碼:服務器

#!/usr/bin/env python
import socket

HOST, PORT = '', 8080

listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
listen_socket.bind((HOST, PORT))
listen_socket.listen(1)
while True:
    client_connection, client_address = listen_socket.accept()
    request = client_connection.recv(1024)
    http_response = """\
HTTP/1.1 200 OK
   Hello World!
"""
    client_connection.sendall(http_response)
    client_connection.close()

這個腳本是一個簡單的web服務器,8080端口,全部訪問都會返回 Hello World!
下面咱們看下配置文件/etc/supervisor/conf.d/webserver.conf網絡

[program:webserver]
autostart=true
startretries=3
command=/opt/webserver.py

查看狀態socket

root@0c1fc23d1398:~# supervisorctl status
webserver                        RUNNING   pid 1120, uptime 0:08:07

supervisorctl命令

1.交互模式

直接輸入supervisorctl就進入交互模式。

root@0c1fc23d1398:~# supervisorctl 
webserver                        RUNNING   pid 1120, uptime 0:09:40
supervisor>

2.命令行模式

如上節所說的supervisorctl status

3.具體命令項

交互和命令行模式有同樣。

reread 從新加載配置文件
update 將配置文件裏新增的子進程加入進程組,若是設置了autostart=true則會啓動新新增的子進程
status 查看全部進程狀態
status 查看指定進程狀態
start all 啓動全部子進程
start  啓動指定子進程
restart all 重啓全部子進程
restart 重啓指定子進程
stop all 中止全部子進程
stop  中止指定子進程
reload 重啓supervisord
add  添加子進程到進程組
reomve  從進程組移除子進程,須要先stop。注意:移除後,須要使用reread和update才能從新運行該進程

web server界面

還記得「配置文件解析」一節關於web server段的配置嗎?不記得能夠回去看一眼。咱們稍微展現下web界面。瀏覽器輸入http://&lt;ip>:<port>,會彈出輸入用戶名和密碼的彈窗,輸入信息後能夠看到界面了。

圖片描述

web界面

從界面中能夠看到,服務的狀態,進程id和運行的時間。還有一些簡單的操做,例如重啓,中止,清除日誌,監控日誌等。
常見的錯誤

1.多進程啓動

報錯信息以下:

Starting supervisor: Error: %(process_num) must be present within process_name when numprocs > 1 in section 'program:nginx' (file: '/etc/supervisor/conf.d/nginx.conf')
For help, use /usr/bin/supervisord -h

這是配置文件格式不對,下面是格式簡介
當numprocs=1時,process_name=%(program_name)s
當numprocs>=2時,%(program_name)s_%(process_num)
相似下面的配置

[program:sleeptime]
autostart=true
startretries=3
command=/opt/sleeptime.py
#主要是下面的2行
process_name=%(program_name)s%(process_num)s
numprocs=4

這個時候查看進程狀態,會發現有4個進程出現

root@0c1fc23d1398:/etc/supervisor/conf.d# supervisorctl status
sleeptime:sleeptime0             RUNNING   pid 1139, uptime 0:00:04
sleeptime:sleeptime1             RUNNING   pid 1140, uptime 0:00:04
sleeptime:sleeptime2             RUNNING   pid 1141, uptime 0:00:04
sleeptime:sleeptime3             RUNNING   pid 1142, uptime 0:00:03
webserver                        RUNNING   pid 1120, uptime 0:30:00

2.直接運行 supervisorctl status 報:

Error: Server requires authentication
For help, use /usr/local/bin/supervisorctl -h

由於你設置訪問帳號密碼,因此只能先supervisorctl進去,在status。主要仍是看日誌信息,和程序自己的日誌。

相關文章
相關標籤/搜索