Supervisor 是基於 Python ,運行於 Unix-Like 系統的進程管理工具。瀏覽器
Supervisor 爲須要以守護進程方式執行的程序提供了不錯的管理方式,也能很友好的管理程序在命令行上輸出的日誌,將日誌重定向到自定義的日誌文件中,按文件大小對日誌進行分割。socket
<!-- more -->ide
Supervisor 有兩個主要的組成部分:工具
supervisord
,運行 Supervisor 時會啓動一個進程 supervisord,負責啓動所管理的進程,並將所管理的進程做爲本身的子進程來啓動,並且能夠在所管理的進程出現崩潰時自動重啓。supervisorctl
,命令行管理工具,用來執行 stop、start、restart 等命令,實現對 supervisord 子進程進行管理。pip install supervisor
echo_supervisord_conf > /etc/supervisord.conf
默認的配置文件是下面這樣的,可是這裏有個坑須要注意,supervisord.pid 以及 supervisor.sock 是放在 /tmp 目錄下,可是 /tmp 目錄是存放臨時文件,裏面的文件是會被 Linux 系統刪除的,一旦這些文件丟失,就沒法再經過 supervisorctl 來執行 restart 和 stop 命令了,將只會獲得 unix:///tmp/supervisor.sock 不存在的錯誤 。ui
[unix_http_server] ;file=/tmp/supervisor.sock ; (the path to the socket file) ;能夠修改成 /var/run 目錄,避免被系統刪除 file=/var/run/supervisor.sock ; (the path to the socket file) ;chmod=0700 ; socket file mode (default 0700) ;chown=nobody:nogroup ; socket file uid:gid owner ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) ;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface) ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) ... [supervisord] ;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log) ;能夠修改成 /var/log 目錄,避免被系統刪除 logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) ;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid) ;修改成 /var/run 目錄,避免被系統刪除 pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) ... ;設置啓動supervisord的用戶,通常狀況下不要輕易用root用戶來啓動,除非你真的肯定要這麼作 ;user=user ; (default is current user, required if root) ... [supervisorctl] ; 必須和'unix_http_server'裏面的設定匹配 ;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket ;修改成 /var/run 目錄,避免被系統刪除 serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=user ; should be same as http_username if set ;password=123 ; should be same as http_password if set ...
supervisor 提供了經過瀏覽器來管理進程的方法,只需解開 /etc/supervisord.conf
以下幾行的註釋.url
;[inet_http_server] ; inet (TCP) server disabled by default ;port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for ;all iface) ;username=user ; (default is no username (open server)) ;password=123 ; (default is no password (open server)) [supervisorctl] ... ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as http_username if set ;password=123 ; should be same as http_password if set
在配置文件的最後,有一個 [include] 的配置項,跟 Nginx 同樣,能夠 include 某個文件夾下的全部配置文件,這樣咱們就能夠爲每一個進程或相關的幾個進程的配置單獨寫成一個文件。命令行
[include] files = /etc/supervisord.d/*.conf
參照 /etc/supervisord.conf
中 program 配置進行子進程的配置debug
;[program:theprogramname] ;command=/bin/cat ; the program (relative uses PATH, can take ar\ gs) ;process_name=%(program_name)s ; process_name expr (default %(program_name)s) ;numprocs=1 ; number of processes copies to start (def 1) ;directory=/tmp ; directory to cwd to before exec (def no cwd) ;umask=022 ; umask for process (default None) ;priority=999 ; the relative start priority (default 999) ;autostart=true ; start at supervisord start (default: true) ;startsecs=1 ; # of secs prog must stay up to be running (d\ ef. 1) ;startretries=3 ; max # of serial start failures when starting\ (default 3) ;autorestart=unexpected ; when to restart if exited after running (def\ : unexpected)
執行 supervisord 命令,將會啓動 supervisord 進程,同時咱們在配置文件中設置的進程也會相應啓動。unix
# 使用默認的配置文件 /etc/supervisord.conf supervisord # 明確指定配置文件 supervisord -c /etc/supervisord.conf
# 中止某一個進程,program_name 爲 [program:x] 裏的 x supervisorctl stop program_name # 啓動某個進程 supervisorctl start program_name # 重啓某個進程 supervisorctl restart program_name # 結束全部屬於名爲 groupworker 這個分組的進程 (start,restart 同理) supervisorctl stop groupworker: # 結束 groupworker:name1 這個進程 (start,restart 同理) supervisorctl stop groupworker:name1 # 中止所有進程,注:start、restart、stop 都不會載入最新的配置文件 supervisorctl stop all # 載入最新的配置文件,中止原有進程並按新的配置啓動、管理全部進程 supervisorctl reload # 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而重啓 supervisorctl update