當(dāng)前部署環(huán)境:CentOS7.6喷市、Python2.7(系統(tǒng)默認(rèn))
簡(jiǎn)介:
??Supervisor是一個(gè) Python 開(kāi)發(fā)的 client/server 系統(tǒng),可以管理和監(jiān)控類(lèi) UNIX 操作系統(tǒng)上面的進(jìn)程威恼。
官網(wǎng):http://supervisord.org/ GitHub:https://github.com/Supervisor/supervisor
??Supervisor是個(gè)父進(jìn)程品姓,你要守護(hù)的進(jìn)程會(huì)以Supervisor的子進(jìn)程形式存在,所以Supervisor才可以對(duì)其進(jìn)行管控箫措。Supervisord 要求管理的程序是腹备,supervisord 會(huì)幫你把它轉(zhuǎn)成daemon程序,因此如果用supervisord來(lái)管理nginx的話斤蔓,必須在nginx的配置文件里添加一行設(shè)置daemon off讓nginx以非daemon方式啟動(dòng)植酥,當(dāng)然了,redis等亦如是弦牡。
組成部分
??supervisord(server 部分):主要負(fù)責(zé)管理子進(jìn)程友驮,響應(yīng)客戶端命令以及日志的輸出等,受控的監(jiān)聽(tīng)進(jìn)程都會(huì)以其子進(jìn)程地方式出現(xiàn)喇伯,不過(guò)如果supervisord的主進(jìn)程非正常退出時(shí)喊儡,被管理的進(jìn)程仍然是運(yùn)行狀態(tài)
??supervisorctl(client 部分):命令行客戶端,用戶可以通過(guò)它與不同的 supervisord 進(jìn)程聯(lián)系稻据,獲取子進(jìn)程的狀態(tài)等
supervisor組件:
supervisord
??supervisord是supervisor的服務(wù)端程序艾猜。
??負(fù)責(zé)啟動(dòng)supervisor程序自身买喧,啟動(dòng)supervisor管理的子進(jìn)程,響應(yīng)來(lái)自clients的請(qǐng)求匆赃,重啟閃退或異常退出的子進(jìn)程淤毛,把子進(jìn)程的stderr或stdout記錄到日志文件中,生成和處理Event
supervisorctl
??如果說(shuō)supervisord是supervisor的服務(wù)端程序算柳,那么supervisorctl就是client端程序了低淡。supervisorctl有一個(gè)類(lèi)型shell的命令行界面,我們可以利用它來(lái)查看子進(jìn)程狀態(tài)瞬项,啟動(dòng)/停止/重啟子進(jìn)程蔗蹋,獲取running子進(jìn)程的列表等等。囱淋。猪杭。最牛逼的一點(diǎn)是,supervisorctl不僅可以連接到本機(jī)上的supervisord妥衣,還可以連接到遠(yuǎn)程的supervisord皂吮,當(dāng)然在本機(jī)上面是通過(guò)UNIX socket連接的,遠(yuǎn)程是通過(guò)TCP socket連接的税手。supervisorctl和supervisord之間的通信蜂筹,是通過(guò)xml_rpc完成的。 相應(yīng)的配置在[supervisorctl]塊里面
Web Server
??Web Server主要可以在界面上管理進(jìn)程芦倒,Web Server其實(shí)是通過(guò)XML_RPC來(lái)實(shí)現(xiàn)的艺挪,可以向supervisor請(qǐng)求數(shù)據(jù),也可以控制supervisor及子進(jìn)程兵扬。配置在[inet_http_server]塊里面闺属。
XML_RPC接口
??這個(gè)就是遠(yuǎn)程調(diào)用的,上面的supervisorctl和Web Server就是它弄的
# 以上概論網(wǎng)絡(luò)拷貝周霉,侵刪
開(kāi)始部署
環(huán)境準(zhǔn)備
#關(guān)閉防火墻及selinux
[root@datacloud21 ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
[root@datacloud21 ~]# setenforce 0
[root@datacloud21 ~]# systemctl stop firewalld
[root@datacloud21 ~]# systemctl disable firewalld
#修改主機(jī)名:
[root@datacloud21 ~]# hostnamectl set-hostname datacloud21 #自定義
一、安裝Supervisor
這里有兩種方式部署
一是源碼編譯方式亚皂,可選擇最新版本安裝(適用于python2.7 centos默認(rèn))【建議】
二是pip或yum方式(系統(tǒng)python2.7俱箱,默認(rèn)支持supervisor最高版本為3.4.0,如果要安裝新版本灭必,需要升級(jí)python到3.4+)
下面我們依次來(lái)看
【源碼編譯安裝】
#安裝依賴
[root@datacloud21 ~]# yum install python-setuptools
#安裝supervisor狞谱,會(huì)下載源碼包進(jìn)行安裝
[root@datacloud21 ~]# easy_install supervisor
#執(zhí)行過(guò)程
[root@datacloud21 ~]# easy_install supervisor
Searching for supervisor
Reading http://mirrors.aliyun.com/pypi/simple/supervisor/
Best match: supervisor 4.1.0
Downloading http://mirrors.aliyun.com/pypi/packages/de/87/ee1ad8fa533a4b5f2c7623f4a2b585d3c1947af7bed8e65bc7772274320e/supervisor-4.1.0.tar.gz#sha256=2dc86fe0476e945e61483d614ceb2cf4f93b95282eb243bdf792621994360383
Processing supervisor-4.1.0.tar.gz
Writing /tmp/easy_install-CrIWW_/supervisor-4.1.0/setup.cfg
Running supervisor-4.1.0/setup.py -q bdist_egg --dist-dir /tmp/easy_install-CrIWW_/supervisor-4.1.0/egg-dist-tmp-MqPT2Y
warning: no previously-included files matching '*' found under directory 'docs/.build'
Adding supervisor 4.1.0 to easy-install.pth file
Installing echo_supervisord_conf script to /usr/bin
Installing pidproxy script to /usr/bin
Installing supervisorctl script to /usr/bin
Installing supervisord script to /usr/bin
Installed /usr/lib/python2.7/site-packages/supervisor-4.1.0-py2.7.egg
Processing dependencies for supervisor
Finished processing dependencies for supervisor
#查看版本
[root@datacloud21 ~]# supervisord -v
4.1.0
#如果easy_install無(wú)法下載,即到官網(wǎng)下載源碼包:https://pypi.org/project/supervisor/
#然后通過(guò)python安裝禁漓,安裝目錄自定義:
[root@datacloud21 ~]# tar zxf supervisor-4.1.0.tar.gz
[root@datacloud21 ~]# cd supervisor-4.1.0
[root@datacloud21 supervisor-4.1.0~]# python setup.py install
【pip方式安裝】
#pip方式安裝
[root@datacloud21 ~]# yum -y install python-pip (如果包提示不存在:yum -y install epel-release)
[root@datacloud21 ~]# pip install supervisor
[root@datacloud21 ~]# supervisord -v
3.4.0
【yum方式安裝】
#yum方式安裝
[root@datacloud21 ~]# yum install supervisor -y
[root@datacloud21 ~]# supervisord -v
3.4.0
二跟衅、創(chuàng)建相關(guān)目錄
[root@datacloud21 ~]# mkdir -p /etc/supervisord.d #存放監(jiān)聽(tīng)進(jìn)程的相關(guān)配置;
[root@datacloud21 ~]# mkdir -p /var/lib/supervisor #存放socket file;
[root@datacloud21 ~]# mkdir -p /home/log/supervisor/ #存放Supervisor日志;
[root@datacloud21 ~]# chown -R zjc.zjc /var/log/supervisor /var/lib/supervisor/ #以非root用戶啟動(dòng)supervisord服務(wù)需要更改此處
三播歼、修改配置文件
[root@datacloud21 ~]# echo_supervisord_conf > /etc/supervisord.conf 生成配置文件(默認(rèn)沒(méi)有此文件)
[root@datacloud21 ~]# cat /etc/supervisord.conf
[unix_http_server]
file=/var/lib/supervisor/supervisor.sock ; the path to the socket file
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=admin ; default is no password (open server)
[supervisord]
logfile=/home/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 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/var/lib/supervisor/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/lib/supervisor/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = /etc/supervisord.d/*.conf #后面監(jiān)控的進(jìn)程對(duì)應(yīng)的配置文件存放這里,supervisor啟動(dòng)自動(dòng)加載相關(guān)配置伶跷。
其他相關(guān)參數(shù)
[unix_http_server]
file=/tmp/supervisor.sock ; socket文件的路徑,supervisorctl用XML_RPC和supervisord通信就是通過(guò)它進(jìn)行 的。如果不設(shè)置的話叭莫,supervisorctl也就不能用了,不設(shè)置的話蹈集,默認(rèn)為none。 非必須設(shè)置
;chmod=0700 ; 這個(gè)簡(jiǎn)單雇初,就是修改上面的那個(gè)socket文件的權(quán)限為0700 不設(shè)置的話拢肆,默認(rèn)為0700。 非必須設(shè)置
;chown=nobody:nogroup ; 這個(gè)一樣靖诗,修改上面的那個(gè)socket文件的屬組為user.group不設(shè)置的話郭怪,默認(rèn)為啟動(dòng)supervisord進(jìn)程的用戶及屬組。非必須設(shè)置
;username=user ; 使用supervisorctl連接的時(shí)候刊橘,認(rèn)證的用戶不設(shè)置的話鄙才,默認(rèn)為不需要用戶。 非必須設(shè)置
;password=123 ; 和上面的用戶名對(duì)應(yīng)的密碼伤为,可以直接使用明碼咒循,也可以使用SHA加密 如:{SHA}82as826d1387bsafe46cc1c8a2ef475eae50cb1d默認(rèn)不設(shè)置。绞愚。叙甸。非必須設(shè)置
;[inet_http_server] ; 偵聽(tīng)在TCP上的socket,Web Server和遠(yuǎn)程的supervisorctl都要用到他位衩,不設(shè)置的話裆蒸,默認(rèn)為不開(kāi)啟。非必須設(shè)置
;port=127.0.0.1:9001 ; 這個(gè)是偵聽(tīng)的IP和端口糖驴,偵聽(tīng)所有IP用 :9001或*:9001僚祷。這個(gè)必須設(shè)置,只要上面的[inet_http_server]開(kāi)啟了贮缕,就必須設(shè)置它
;username=user ; 這個(gè)和上面的uinx_http_server一個(gè)樣辙谜。非必須設(shè)置
;password=123 ; 這個(gè)也一個(gè)樣。非必須設(shè)置
[supervisord] ;這個(gè)主要是定義supervisord這個(gè)服務(wù)端進(jìn)程的一些參數(shù)的這個(gè)必須設(shè)置感昼,不設(shè)置装哆,supervisor就不用干活了
logfile=/tmp/supervisord.log ; 這個(gè)是supervisord這個(gè)主進(jìn)程的日志路徑,注意和子進(jìn)程的日志不搭嘎定嗓。默認(rèn)路徑$CWD/supervisord.log蜕琴,$CWD是當(dāng)前目錄。宵溅。非必須設(shè)置
logfile_maxbytes=50MB ; 這個(gè)是上面那個(gè)日志文件的最大的大小凌简,當(dāng)超過(guò)50M的時(shí)候,會(huì)生成一個(gè)新的日志文件恃逻。當(dāng)設(shè)置為0時(shí)雏搂,表示不限制文件大小 默認(rèn)值是50M藕施,非必須設(shè)置。
logfile_backups=10 ; 日志文件保持的數(shù)量畔派,supervisor在啟動(dòng)程序時(shí)铅碍,會(huì)自動(dòng)創(chuàng)建10個(gè)buckup文件,用于log rotate當(dāng)設(shè)置為0時(shí)线椰,表示不限制文件的數(shù)量胞谈。 默認(rèn)情況下為10。憨愉。烦绳。非必須設(shè)置
loglevel=info ; 日志級(jí)別,有critical, error, warn, info, debug, trace, or blather等默認(rèn)為info配紫。径密。。非必須設(shè)置項(xiàng)
pidfile=/tmp/supervisord.pid ; supervisord的pid文件路徑躺孝。默認(rèn)為$CWD/supervisord.pid享扔。。植袍。非必須設(shè)置
nodaemon=false ; 如果是true惧眠,supervisord進(jìn)程將在前臺(tái)運(yùn)行默認(rèn)為false,也就是后臺(tái)以守護(hù)進(jìn)程運(yùn)行于个。氛魁。。非必須設(shè)置
minfds=1024 ; 這個(gè)是最少系統(tǒng)空閑的文件描述符厅篓,低于這個(gè)值supervisor將不會(huì)啟動(dòng)秀存。系統(tǒng)的文件描述符在這里設(shè)置cat /proc/sys/fs/file-max 默認(rèn)情況下為1024。羽氮。或链。非必須設(shè)置
minprocs=200 ; 最小可用的進(jìn)程描述符,低于這個(gè)值supervisor也將不會(huì)正常啟動(dòng)档押。ulimit -u這個(gè)命令株扛,可以查看linux下面用戶的最大進(jìn)程數(shù)默認(rèn)為200。汇荐。。非必須設(shè)置
;umask=022 ; 進(jìn)程創(chuàng)建文件的掩碼默認(rèn)為022盆繁。掀淘。非必須設(shè)置項(xiàng)
;user=chrism ; 這個(gè)參數(shù)可以設(shè)置一個(gè)非root用戶,當(dāng)我們以root用戶啟動(dòng)supervisord之后油昂。我這里面設(shè)置的這個(gè)用戶革娄,也可以對(duì)supervisord進(jìn)行管理默認(rèn)情況是不設(shè)置倾贰。。拦惋。非必須設(shè)置項(xiàng)
;identifier=supervisor ; 這個(gè)參數(shù)是supervisord的標(biāo)識(shí)符匆浙,主要是給XML_RPC用的。當(dāng)你有多supervisor的時(shí)候厕妖,而且想調(diào)用XML_RPC統(tǒng)一管理首尼,就需要為每個(gè)supervisor設(shè)置不同的標(biāo)識(shí)符了默認(rèn)是supervisord。言秸。软能。非必需設(shè)置
;directory=/tmp ; 這個(gè)參數(shù)是當(dāng)supervisord作為守護(hù)進(jìn)程運(yùn)行的時(shí)候,設(shè)置這個(gè)參數(shù)的話举畸,啟動(dòng)supervisord進(jìn)程之前查排,會(huì)先切換到這個(gè)目錄默認(rèn)不設(shè)置。抄沮。跋核。非必須設(shè)置
;nocleanup=true ; 這個(gè)參數(shù)當(dāng)為false的時(shí)候,會(huì)在supervisord進(jìn)程啟動(dòng)的時(shí)候叛买,把以前子進(jìn)程產(chǎn)生的日志文件(路徑為AUTO的情況下)清除掉砂代。有時(shí)候咱們想要看歷史日志,當(dāng) 然不想日志被清除了聪全。所以可以設(shè)置為true默認(rèn)是false泊藕,有調(diào)試需求的同學(xué)可以設(shè)置為true。难礼。娃圆。非必須設(shè)置
;childlogdir=/tmp ; 當(dāng)子進(jìn)程日志路徑為AUTO的時(shí)候,子進(jìn)程日志文件的存放路徑蛾茉。默認(rèn)路徑是這個(gè)東西讼呢,執(zhí)行下面的這個(gè)命令看看就OK了,處理的東西就默認(rèn)路徑python -c "import tempfile;print tempfile.gettempdir()"非必須設(shè)置
;environment=KEY="value" ; 這個(gè)是用來(lái)設(shè)置環(huán)境變量的谦炬,supervisord在linux中啟動(dòng)默認(rèn)繼承了linux的環(huán)境變量悦屏,在這里可以設(shè)置supervisord進(jìn)程特有的其他環(huán)境變量。supervisord啟動(dòng)子進(jìn)程時(shí)键思,子進(jìn)程會(huì)拷貝父進(jìn)程的內(nèi)存空間內(nèi)容础爬。 所以設(shè)置的這些環(huán)境變量也會(huì)被子進(jìn)程繼承。小例子:environment=name="haha",age="hehe"默認(rèn)為不設(shè)置吼鳞。看蚜。。非必須設(shè)置
;strip_ansi=false ; 這個(gè)選項(xiàng)如果設(shè)置為true赔桌,會(huì)清除子進(jìn)程日志中的所有ANSI 序列供炎。什么是ANSI序列呢渴逻?就是我們的\n,\t這些東西。默認(rèn)為false音诫。惨奕。。非必須設(shè)置
[rpcinterface:supervisor] ;這個(gè)選項(xiàng)是給XML_RPC用的竭钝,當(dāng)然你如果想使用supervisord或者web server 這 個(gè)選項(xiàng)必須要開(kāi)啟的supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] ;這個(gè)主要是針對(duì)supervisorctl的一些配置
serverurl=unix:///tmp/supervisor.sock ; 這個(gè)是supervisorctl本地連接supervisord的時(shí)候梨撞,本地UNIX socket路徑,注意這個(gè)是和前面的[unix_http_server]對(duì)應(yīng)的默認(rèn)值就是unix:///tmp/supervisor.sock蜓氨。聋袋。非必須設(shè)置
;serverurl=http://127.0.0.1:9001 ; 這個(gè)是supervisorctl遠(yuǎn)程連接supervisord的時(shí)候,用到的TCP socket路徑注意這個(gè)和前面的[inet_http_server]對(duì)應(yīng)默認(rèn)就是http://127.0.0.1:9001穴吹。幽勒。。非必須項(xiàng)
;username=chris ; 用戶名默認(rèn)空港令。啥容。非必須設(shè)置
;password=123 ; 密碼默認(rèn)空。顷霹。非必須設(shè)置
;prompt=mysupervisor ; 輸入用戶名密碼時(shí)候的提示符默認(rèn)supervisor咪惠。。非必須設(shè)置
;history_file=~/.sc_history ; 這個(gè)參數(shù)和shell中的history類(lèi)似淋淀,我們可以用上下鍵來(lái)查找前面執(zhí)行過(guò)的命令默認(rèn)是no file的遥昧。。所以我們想要有這種功能朵纷,必須指定一個(gè)文件炭臭。。袍辞。非必須設(shè)置
;[program:theprogramname] ;這個(gè)就是咱們要管理的子進(jìn)程了鞋仍,":"后面的是名字,最好別亂寫(xiě)和實(shí)際進(jìn)程有點(diǎn)關(guān)聯(lián)最好搅吁。這樣的program我們可以設(shè)置一個(gè)或多個(gè)威创,一個(gè)program就是要被管理的一個(gè)進(jìn)程
;command=/bin/cat ; 這個(gè)就是我們的要啟動(dòng)進(jìn)程的命令路徑了,可以帶參數(shù)例子:/home/test.py -a 'hehe'有一點(diǎn)需要注意的是谎懦,我們的command只能是那種在終端運(yùn)行的進(jìn)程肚豺,不能是守護(hù)進(jìn)程。這個(gè)想想也知道了界拦,比如說(shuō)command=service httpd start详炬。httpd這個(gè)進(jìn)程被linux的service管理了,我們的supervisor再去啟動(dòng)這個(gè)命令這已經(jīng)不是嚴(yán)格意義的子進(jìn)程了。 這個(gè)是個(gè)必須設(shè)置的項(xiàng)
;process_name=%(program_name)s ; 這個(gè)是進(jìn)程名呛谜,如果我們下面的numprocs參數(shù)為1的話,就不用管這個(gè)參數(shù)了枪萄,它默認(rèn)值%(program_name)s也就是上面的那個(gè)program冒號(hào)后面的名字隐岛,但是如果numprocs為多個(gè)的話,那就不能這么干了瓷翻。想想也知道聚凹,不可能每個(gè)進(jìn)程都用同一個(gè)進(jìn)程名吧。
;numprocs=1 ; 啟動(dòng)進(jìn)程的數(shù)目齐帚。當(dāng)不為1時(shí)妒牙,就是進(jìn)程池的概念,注意process_name的設(shè)置默認(rèn)為1 对妄。湘今。非必須設(shè)置
;directory=/tmp ; 進(jìn)程運(yùn)行前,會(huì)前切換到這個(gè)目錄默認(rèn)不設(shè)置剪菱。摩瞎。。非必須設(shè)置
;umask=022 ; 進(jìn)程掩碼孝常,默認(rèn)none旗们,非必須
;priority=999 ; 子進(jìn)程啟動(dòng)關(guān)閉優(yōu)先級(jí),優(yōu)先級(jí)低的构灸,最先啟動(dòng)上渴,關(guān)閉的時(shí)候最后關(guān)閉默認(rèn)值為999 。喜颁。非必須設(shè)置
;autostart=true ; 如果是true的話稠氮,子進(jìn)程將在supervisord啟動(dòng)后被自動(dòng)啟動(dòng)默認(rèn)就是true 。洛巢。非必須設(shè)置
;autorestart=unexpected ; 這個(gè)是設(shè)置子進(jìn)程掛掉后自動(dòng)重啟的情況括袒,有三個(gè)選項(xiàng),false,unexpected和true稿茉。如果為false的時(shí)候锹锰,無(wú)論什么情況下,都不會(huì)被重新啟動(dòng)漓库,如果為unexpected恃慧,只有當(dāng)進(jìn)程的退出碼不在下面的exitcodes里面定義的退出碼的時(shí)候,才會(huì)被自動(dòng)重啟渺蒿。當(dāng)為true的時(shí)候痢士,只要子進(jìn)程掛掉,將會(huì)被無(wú)條件的重啟
;startsecs=1 ; 這個(gè)選項(xiàng)是子進(jìn)程啟動(dòng)多少秒之后茂装,此時(shí)狀態(tài)如果是running怠蹂,則我們認(rèn)為啟動(dòng)成功了默認(rèn)值為1 善延。。非必須設(shè)置
;startretries=3 ; 當(dāng)進(jìn)程啟動(dòng)失敗后城侧,最大嘗試啟動(dòng)的次數(shù)易遣。。當(dāng)超過(guò)3次后嫌佑,supervisor將把此進(jìn)程的狀態(tài)置為FAIL默認(rèn)值為3 豆茫。。非必須設(shè)置
;exitcodes=0,2 ; 注意和上面的的autorestart=unexpected對(duì)應(yīng)屋摇。揩魂。exitcodes里面的定義的退出碼是expected的。
;stopsignal=QUIT ; 進(jìn)程停止信號(hào)炮温,可以為T(mén)ERM, HUP, INT, QUIT, KILL, USR1, or USR2等信號(hào)默認(rèn)為T(mén)ERM 火脉。。當(dāng)用設(shè)定的信號(hào)去干掉進(jìn)程茅特,退出碼會(huì)被認(rèn)為是expected非必須設(shè)置
;stopwaitsecs=10 ; 這個(gè)是當(dāng)我們向子進(jìn)程發(fā)送stopsignal信號(hào)后忘分,到系統(tǒng)返回信息給supervisord,所等待的最大時(shí)間白修。 超過(guò)這個(gè)時(shí)間妒峦,supervisord會(huì)向該子進(jìn)程發(fā)送一個(gè)強(qiáng)制kill的信號(hào)。默認(rèn)為10秒兵睛。肯骇。非必須設(shè)置
;stopasgroup=false ; 這個(gè)東西主要用于,supervisord管理的子進(jìn)程祖很,這個(gè)子進(jìn)程本身還有子進(jìn)程笛丙。那么我們?nèi)绻麅H僅干掉supervisord的子進(jìn)程的話,子進(jìn)程的子進(jìn)程有可能會(huì)變成孤兒進(jìn)程假颇。所以咱們可以設(shè)置可個(gè)選項(xiàng)胚鸯,把整個(gè)該子進(jìn)程的整個(gè)進(jìn)程組都干掉。 設(shè)置為true的話笨鸡,一般killasgroup也會(huì)被設(shè)置為true姜钳。需要注意的是,該選項(xiàng)發(fā)送的是stop信號(hào)默認(rèn)為false形耗。哥桥。非必須設(shè)置。激涤。
;killasgroup=false ; 這個(gè)和上面的stopasgroup類(lèi)似拟糕,不過(guò)發(fā)送的是kill信號(hào)
;user=chrism ; 如果supervisord是root啟動(dòng),我們?cè)谶@里設(shè)置這個(gè)非root用戶,可以用來(lái)管理該program默認(rèn)不設(shè)置送滞。侠草。。非必須設(shè)置項(xiàng)
;redirect_stderr=true ; 如果為true犁嗅,則stderr的日志會(huì)被寫(xiě)入stdout日志文件中默認(rèn)為false梦抢,非必須設(shè)置
;stdout_logfile=/a/path ; 子進(jìn)程的stdout的日志路徑,可以指定路徑愧哟,AUTO,none等三個(gè)選項(xiàng)哼蛆。設(shè)置為none的話蕊梧,將沒(méi)有日志產(chǎn)生。設(shè)置為AUTO的話腮介,將隨機(jī)找一個(gè)地方生成日志文件肥矢,而且當(dāng)supervisord重新啟動(dòng)的時(shí)候,以前的日志文件會(huì)被清空。當(dāng) redirect_stderr=true的時(shí)候,sterr也會(huì)寫(xiě)進(jìn)這個(gè)日志文件
;stdout_logfile_maxbytes=1MB ; 日志文件最大大小摄杂,和[supervisord]中定義的一樣垫释。默認(rèn)為50
;stdout_logfile_backups=10 ; 和[supervisord]定義的一樣。默認(rèn)10
;stdout_capture_maxbytes=1MB ; 這個(gè)東西是設(shè)定capture管道的大小野瘦,當(dāng)值不為0的時(shí)候,子進(jìn)程可以從stdout發(fā)送信息,而supervisor可以根據(jù)信息忘嫉,發(fā)送相應(yīng)的event。默認(rèn)為0案腺,為0的時(shí)候表達(dá)關(guān)閉管道庆冕。。劈榨。非必須項(xiàng)
;stdout_events_enabled=false ; 當(dāng)設(shè)置為ture的時(shí)候访递,當(dāng)子進(jìn)程由stdout向文件描述符中寫(xiě)日志的時(shí)候,將觸發(fā)supervisord發(fā)送PROCESS_LOG_STDOUT類(lèi)型的event默認(rèn)為false同辣。拷姿。。非必須設(shè)置
;stderr_logfile=/a/path ; 這個(gè)東西是設(shè)置stderr寫(xiě)的日志路徑邑闺,當(dāng)redirect_stderr=true跌前。這個(gè)就不用設(shè)置了,設(shè)置了也是白搭陡舅。因?yàn)樗鼤?huì)被寫(xiě)入stdout_logfile的同一個(gè)文件中抵乓,默認(rèn)為AUTO,也就是隨便找個(gè)地存,supervisord重啟被清空灾炭。茎芋。非必須設(shè)置
;stderr_logfile_maxbytes=1MB ; 這個(gè)出現(xiàn)好幾次了,就不重復(fù)了
;stderr_logfile_backups=10 ; 這個(gè)也是
;stderr_capture_maxbytes=1MB ; 這個(gè)一樣蜈出,和stdout_capture一樣田弥。 默認(rèn)為0,關(guān)閉狀態(tài)
;stderr_events_enabled=false ; 這個(gè)也是一樣铡原,默認(rèn)為false
;environment=A="1",B="2" ; 這個(gè)是該子進(jìn)程的環(huán)境變量偷厦,和別的子進(jìn)程是不共享的
;serverurl=AUTO ;
;[eventlistener:theeventlistenername] ;這個(gè)東西其實(shí)和program的地位是一樣的,也是suopervisor啟動(dòng)的子進(jìn)程燕刻,不過(guò)它干的活是訂閱supervisord發(fā)送的event只泼。他的名字就叫 listener了。我們可以在listener里面做一系列處理卵洗,比如報(bào)警等等樓主這兩天干的活请唱,就是弄的這玩意
;command=/bin/eventlistener ; 這個(gè)和上面的program一樣,表示listener的可執(zhí)行文件的路徑
;process_name=%(program_name)s ; 這個(gè)也一樣过蹂,進(jìn)程名十绑,當(dāng)下面的numprocs為多個(gè)的時(shí)候,才需要酷勺。否則默認(rèn)就OK了
;numprocs=1 ; 相同的listener啟動(dòng)的個(gè)數(shù)
;events=EVENT ; event事件的類(lèi)型本橙,也就是說(shuō),只有寫(xiě)在這個(gè)地方的事件類(lèi)型鸥印。才會(huì)被發(fā)送
;buffer_size=10 ; 這個(gè)是event隊(duì)列緩存大小勋功,單位不太清楚,樓主猜測(cè)應(yīng)該是個(gè)吧库说。當(dāng)buffer超過(guò)10的時(shí)候狂鞋,最舊的event將會(huì)被清除,并把新的event放進(jìn)去潜的。默認(rèn)值為10骚揍。。非必須選項(xiàng)
;directory=/tmp ; 進(jìn)程執(zhí)行前啰挪,會(huì)切換到這個(gè)目錄下執(zhí)行默認(rèn)為不切換信不。。亡呵。非必須
;umask=022 ; 淹沒(méi)抽活,默認(rèn)為none,不說(shuō)了
;priority=-1 ; 啟動(dòng)優(yōu)先級(jí)锰什,默認(rèn)-1下硕,也不扯了
;autostart=true ; 是否隨supervisord啟動(dòng)一起啟動(dòng)丁逝,默認(rèn)true
;autorestart=unexpected ; 是否自動(dòng)重啟,和program一個(gè)樣梭姓,分true,false,unexpected等霜幼,注意unexpected和exitcodes的關(guān)系
;startsecs=1 ; 也是一樣,進(jìn)程啟動(dòng)后跑了幾秒鐘誉尖,才被認(rèn)定為成功啟動(dòng)罪既,默認(rèn)1
;startretries=3 ; 失敗最大嘗試次數(shù),默認(rèn)3
;exitcodes=0,2 ; 期望或者說(shuō)預(yù)料中的進(jìn)程退出碼铡恕,
;stopsignal=QUIT ; 干掉進(jìn)程的信號(hào)琢感,默認(rèn)為T(mén)ERM,比如設(shè)置為QUIT探熔,那么如果QUIT來(lái)干這個(gè)進(jìn)程那么會(huì)被認(rèn)為是正常維護(hù)猩谊,退出碼也被認(rèn)為是expected中的
;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=chrism ;設(shè)置普通用戶,可以用來(lái)管理該listener進(jìn)程祭刚。默認(rèn)為空。墙牌。非必須設(shè)置
;redirect_stderr=true ; 為true的話涡驮,stderr的log會(huì)并入stdout的log里面默認(rèn)為false。喜滨。捉捅。非必須設(shè)置
;stdout_logfile=/a/path ; 這個(gè)不說(shuō)了,好幾遍了
;stdout_logfile_maxbytes=1MB ; 這個(gè)也是
;stdout_logfile_backups=10 ; 這個(gè)也是
;stdout_events_enabled=false ; 這個(gè)其實(shí)是錯(cuò)的虽风,listener是不能發(fā)送event
;stderr_logfile=/a/path ; 這個(gè)也是
;stderr_logfile_maxbytes=1MB ; 這個(gè)也是
;stderr_logfile_backups ; 這個(gè)不說(shuō)了
;stderr_events_enabled=false ; 這個(gè)也是錯(cuò)的棒口,listener不能發(fā)送event
;environment=A="1",B="2" ; 這個(gè)是該子進(jìn)程的環(huán)境變量默認(rèn)為空。辜膝。无牵。非必須設(shè)置
;serverurl=AUTO ; override serverurl computation (childutils)
;[group:thegroupname] ;這個(gè)東西就是給programs分組,劃分到組里面的program厂抖。我們就不用一個(gè)一個(gè)去操作了我們可以對(duì)組名進(jìn)行統(tǒng)一的操作茎毁。 注意:program被劃分到組里面之后,就相當(dāng)于原來(lái)的配置從supervisor的配置文件里消失了忱辅。七蜘。。supervisor只會(huì)對(duì)組進(jìn)行管理墙懂,而不再會(huì)對(duì)組里面的單個(gè)program進(jìn)行管理了
;programs=progname1,progname2 ; 組成員橡卤,用逗號(hào)分開(kāi)這個(gè)是個(gè)必須的設(shè)置項(xiàng)
;priority=999 ; 優(yōu)先級(jí),相對(duì)于組和組之間說(shuō)的默認(rèn)999损搬。碧库。非必須選項(xiàng)
;[include] ;這個(gè)東西挺有用的柜与,當(dāng)我們要管理的進(jìn)程很多的時(shí)候,寫(xiě)在一個(gè)文件里面就有點(diǎn)大了谈为。我們可以把配置信息寫(xiě)到多個(gè)文件中旅挤,然后include過(guò)來(lái)
;files = relative/directory/*.ini
#(以上參數(shù)網(wǎng)絡(luò)拷貝,侵刪)
四伞鲫、創(chuàng)建守護(hù)進(jìn)程的配置文件(每個(gè)服務(wù)單獨(dú)一個(gè))
#如監(jiān)聽(tīng)cesi進(jìn)程:
[root@datacloud21 ~]# cat /etc/supervisord.d/cesi.conf
[program:cesi]
directory = /home/cesi/cesi/ #進(jìn)程對(duì)應(yīng)的路徑
command = python3 /home/cesi/cesi/run.py --config-file /etc/cesi.conf.toml #進(jìn)程啟動(dòng)命令
autostart = true #是否隨supervisord啟動(dòng)一起啟動(dòng)
startsecs = 5 #進(jìn)程啟動(dòng)后跑了幾秒鐘粘茄,才被認(rèn)定為成功啟動(dòng)
autorestart = true #異常退出自動(dòng)重啟
startretries = 3 #嘗試重啟失敗的最大次數(shù)
user = root #啟動(dòng)用戶
redirect_stderr = true #如果為true,則stderr的日志會(huì)被寫(xiě)入stdout日志文件中默認(rèn)為false
stdout_logfile = /home/log/supervisor/cesi_out.log #進(jìn)程的日志輸出
五秕脓、配置Supervisor啟動(dòng)文件
[root@datacloud21 ~]# cat /usr/lib/systemd/system/supervisord.service
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisord $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
#啟動(dòng)
[root@datacloud21 ~]# systemctl daemon-reload
[root@datacloud21 ~]# systemctl start supervisord
[root@datacloud21 ~]# systemctl enable supervisord
#驗(yàn)證是否開(kāi)機(jī)啟動(dòng)
[root@datacloud21 ~]# systemctl is-enabled supervisord
enabled
#也可命令行方式啟動(dòng) supervisord
supervisord -c /etc/supervisord.conf
六柒瓣、啟動(dòng)Supervisor進(jìn)程
[root@datacloud21 ~]# ss -tanl|grep 9001
LISTEN 0 128 *:9001 *:*
#訪問(wèn)
http://IP:9001
七、常用命令
supervisorctl status:#查看所有進(jìn)程的狀態(tài)
supervisorctl start <program_name>:#啟動(dòng)一個(gè)服務(wù)吠架;
supervisorctl restart <program_name>:#重啟一個(gè)服務(wù)(注意:重啟服務(wù)不會(huì)重新加載配置文件)
supervisorctl start all #啟動(dòng)所有進(jìn)程
supervisorctl stop all #停止所有進(jìn)程
supervisorctl update #每次修改配置后芙贫,建議使用此命令,不會(huì)全部重啟傍药,只重啟配置更新的子程序
supervisorctl reload #重新加載配置并重啟supervisord磺平,重啟所有子程序
supervisorctl reread #重新加載配置文件,但不會(huì)重啟配置有變動(dòng)的服務(wù)拐辽;
supervisorctl shutdown #關(guān)閉supervisord
supervisorctl stop <program_name> #關(guān)閉一個(gè)服務(wù)拣挪;
supervisorctl update #重新加載配置文件,并重啟配置有變動(dòng)的服務(wù)俱诸;
supervisorctl clear <program_name> #清理一個(gè)服務(wù)的 stdout log菠劝;
#也可以進(jìn)入supervision控制臺(tái)
sudo supervisorctl
stop cesi 停止服務(wù)
start cesi 啟動(dòng)服務(wù)
supervisorctl tail programname [stdout|stderr] #該命令是動(dòng)態(tài)的輸出啟動(dòng)進(jìn)程時(shí)的輸出
知識(shí)點(diǎn)
??雖然Supervisor與被監(jiān)控進(jìn)程之間是“父子”關(guān)系模式,一毀俱毀(是因?yàn)閳?zhí)行了systemctl stop supervisord命令睁搭,)赶诊;但是通過(guò)kill supervisord pid 的方式“不會(huì)”導(dǎo)致后端“所有”監(jiān)控程序掛掉的情況出現(xiàn),因?yàn)閟upervisord是在nodaemon=false默認(rèn)下運(yùn)行园骆。
#所在配置文件
[root@datacloud21 ~]# cat /etc/supervisord.conf | grep nodaemon
nodaemon=false
#默認(rèn)supervisord是以守護(hù)進(jìn)程方式運(yùn)行舔痪。
#放在supervisord配置模塊下
[supervisord]
nodaemon=false
拓展
??Supervisor不太友好的地方是,如果我們線上有很多臺(tái)主機(jī)锌唾,那么每臺(tái)主機(jī)部署一個(gè)守護(hù)進(jìn)程辙喂,維護(hù)的話登錄每臺(tái)主機(jī)操作,顯然不太現(xiàn)實(shí)鸠珠。因此引入了便捷式管理工具cesi巍耗。
??下篇文章詳細(xì)介紹------CeSi(Supervisor 守護(hù)進(jìn)程集中管理工具)