yum安裝supervisor
yum install epel-release
yum install -y supervisor
systemctl enable supervisord # 開機自啟動
systemctl start supervisord # 啟動supervisord服務
systemctl status supervisord # 檢視supervisord服務狀态
ps -ef|grep supervisord # 檢視是否存在supervisord程序
yum安裝會生成一個配置檔案,路徑/etc/supervisord.conf,修改最後一行配置檔案路徑,可改可不改,我比較習慣conf配置
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 檔案,supervisorctl用XML_RPC和supervisord通信就是通過它進行,如果不設定的話,supervisorctl也就不能用了
;chmod=0700 ;socket檔案的mode(權限),預設是0700
;chown=nobody:nogroup ;socket檔案的owner(屬組),格式:uid:gid
;username=user ;使用supervisorctl連接配接的時候,認證的使用者(預設沒有使用者名)
;password=123 ;和上面的使用者名對應的密碼,可以直接使用明碼,也可以使用SHA加密(預設沒有密碼)
;[inet_http_server] ;偵聽在TCP上的socket,Web Server和遠端的supervisorctl都要用到它不設定的話,預設為不開啟。
;port=127.0.0.1:9001 ;這個是管理背景運作的IP和端口,偵聽所有IP用:9001或*:9001。如果上面的[inet_http_server]開啟了,就必須設定它。如果開放到公網,需要注意安全性
;username=user ;同上面的[unix_http_server]使用者名配置一緻
;password=123 ;同上面的[unix_http_server]密碼配置一緻
[supervisord] ;這個主要是定義supervisord這個服務端程序的一些參數的
logfile=/tmp/supervisord.log ;這個是supervisord這個主程序的日志路徑,注意和子程序的日志沒有關系。預設是 $CWD/supervisord.log,$CWD是目前目錄。
logfile_maxbytes=50MB ;日志檔案大小,預設50MB。超過50M的時候,會生成一個新的日志檔案;如果設成0,表示不限制大小。
logfile_backups=10 ;日志檔案保留備份數量預設10,設為0表示不備份
loglevel=info ;日志級别,預設info,其它: critical, error, warn, info, debug, trace, or blather
pidfile=/tmp/supervisord.pid ;pid 檔案
nodaemon=false ;是否在前台啟動,預設是false,即以 daemon 的方式啟動
minfds=1024 ;可以打開的檔案描述符的最小值,預設 1024,低于這個值supervisor将不會啟動。
minprocs=200 ;可以打開的程序數的最小值,預設200,低于這個值supervisor也将不會正常啟動。
;umask=022 ;程序建立檔案的掩碼,預設為022。
;user=chrism ; 這個參數可以設定一個非root使用者,當我們以root使用者啟動supervisord之後。我這裡面設定的這個使用者,也可以對supervisord進行管理,預設情況是不設定。
;identifier=supervisor ;這個參數是supervisord的辨別符,主要是給XML_RPC用的。當你有多個supervisor的時候,而且想調用XML_RPC統一管理,就需要為每個supervisor設定不同的辨別符,預設是supervisord。
;directory=/tmp ;這個參數是當supervisord作為守護程序運作的時候,設定這個參數的話,啟動supervisord程序之前,會先切換到這個目錄預設不設定。
;nocleanup=true ;這個參數當為false的時候,會在supervisord程序啟動的時候,把以前子程序産生的日志檔案(路徑為AUTO的情況下)清除掉。有時候咱們想要看曆史日志,當 然不想日志被清除了。是以可以設定為true,預設是false,有調試需求的同學可以設定為true。
;childlogdir=/tmp ;當子程序日志路徑為AUTO(系統自動配置設定)的時候,子程序日志檔案的存放路徑。
;environment=KEY="value" ;這個是用來設定環境變量的,supervisord在linux中啟動預設繼承了linux環境變量,在這裡可以設定supervisord程序特有的其他環境變量。supervisord啟動子程序時,子程序會拷貝父程序的記憶體空間内容。 是以設定的這些環境變量也會被子程序繼承。預設為不設定。
;strip_ansi=false ;這個選項如果設定為true,會清除子程序日志中的所有ANSI 序列。什麼是ANSI序列呢?就是我們的\n,\t這些東西。預設為false。
[supervisorctl] ;這個主要是針對supervisorctl的一些配置
serverurl=unix:///tmp/supervisor.sock ;通過UNIX socket連接配接supervisord,路徑與unix_http_server部分的file一緻
;serverurl=http://127.0.0.1:9001 ; 通過HTTP的方式連接配接supervisord
;username=chris ;使用者名,預設空
;password=123 ;密碼,預設空。
;prompt=mysupervisor ;輸入使用者名密碼時候的提示,預設supervisor。
;history_file=~/.sc_history ;這個參數和shell中的history類似,我們可以用上下鍵來查找前面執行過的指令預設是no file的。是以我們想要有這種功能,必須指定一個檔案。
;[program:xx] ;是被管理的程序配置參數,xx是程序的名稱
;command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ;程式啟動指令;可以帶參數,如:/home/test.py -a 'hehe'有一點需要注意的是,我們的command隻能是那種在終端運作的程序,不能是守護程序。這個想想也知道了,比如說command=service httpd start。httpd這個程序被linux的service管理了,我們的supervisor再去啟動這個指令,這已經不是嚴格意義的子程序了。
;directory=/tmp ;程序運作前,會前切換到這個目錄
;autostart=true ;在supervisord啟動的時候也自動啟動
;startsecs=10 ;啟動10秒後沒有異常退出,就表示程序正常啟動了,預設為1秒。
;autorestart=true ;程式退出後自動重新開機,可選值:[unexpected,true,false],預設為unexpected,表示程序意外殺死後才重新開機
這個是設定子程序挂掉後自動重新開機的情況,如果為false的時候,無論什麼情況下,都不會被重新啟動,如果為unexpected,隻有當程序的退出碼不在下面的exitcodes裡面定義的退出碼的時候,才會被自動重新開機。當為true的時候,隻要子程序挂掉,将會被無條件的重新開機。
;exitcodes=0,2 ;注意和上面的的autorestart=unexpected對應。exitcodes裡面的定義的退出碼是expected的。
;stopsignal=QUIT ;程序停止信号,可以為TERM, HUP, INT, QUIT, KILL, USR1, or USR2等信号。預設為TERM 。當用設定的信号去幹掉程序,退出碼會被認為是expected。
;stopwaitsecs=10 ;這個是當我們向子程序發送stopsignal信号後,到系統傳回資訊給supervisord,所等待的最大時間。 超過這個時間,supervisord會向該子程序發送一個強制kill的信号。 預設為10秒。
;startretries=3 ;啟動失敗自動重試次數,預設是3。當超過3次後,supervisor将把此程序的狀态置為FAIL
;user=tomcat ;用哪個使用者啟動程序,預設是root。如果supervisord是root啟動,我們在這裡設定這個非root使用者,可以用來管理該program。
;priority=999 ;程序啟動優先級,預設999,值小的優先啟動
;redirect_stderr=true ;把stderr重定向到stdout,預設false
;stdout_logfile_maxbytes=20MB ;stdout日志檔案大小,預設50MB
;stdout_logfile_backups = 20 ;stdout日志檔案備份數,預設是10
;stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out ;程序的stdout的日志路徑,可以指定路徑,AUTO,none等三個選項。設定為none的話,将沒有日志産生。設定為AUTO的話,将随機找一個地方生成日志檔案,而且當supervisord重新啟動的時候,以前的日志檔案會被清空。當 ;redirect_stderr=true的時候,sterr也會寫進這個日志檔案。需要注意當指定目錄不存在時無法正常啟動,是以需要手動建立目錄(supervisord 會自動建立日志檔案)
;stopasgroup=false ;預設為false,程序被殺死時,是否向這個程序組發送stop信号,包括子程序。主要用于,supervisord管理的子程序,這個子程序本身還有子程序。那麼我們如果僅僅幹掉supervisord的子程序的話,子程序的子程序有可能會變成孤兒程序。是以咱們可以設定可個選項,把整個該子程序的整個程序組都幹掉。 設定為true的話,一般killasgroup也會被設定為true。需要注意的是,該選項發送的是stop。預設為false。
;killasgroup=false ;信号預設為false,不過向程序組發送的是kill信号
;stderr_capture_maxbytes=1MB ;這個一樣,和stdout_capture一樣。 預設為0,關閉狀态
;stderr_events_enabled=false ;這個也是一樣,預設為false
;environment=A="1",B="2" ;這個是該子程序的環境變量,和别的子程序是不共享的
;serverurl=AUTO
;[group:thegroupname] ;就是給programs(子程序)分組,劃分到組裡面的program。我們就不用一個一個去操作了,我們可以對組名進行統一的操作。 注意:program被劃分到組裡面之後,就相當于原來的配置從supervisor的配置檔案裡消失了。supervisor隻會對組進行管理,而不再會對組裡面的單個program進行管理了
;programs=progname1,progname2 ;組成員,用逗号分開。
;priority=999 ;優先級,相對于組群組之間說的。預設999。
;包含其它配置檔案 ;當我們要管理的程序很多的時候,都寫在主配置檔案就不太合适了,這個時候可以把配置資訊寫到多個檔案中,然後include過來
[include]
files = supervisord.d/*.conf; 配置檔案路徑,看個人喜好,我偏向以conf結尾
在配置檔案路徑下建立test.conf,内容如下
[program:test] #程式的名稱
command=/usr/local/php/bin/php /mnt/hgfs/project/www/blog/artisan command:test #執行的指令
autostart=true #是否跟随supervisord的啟動而啟動
autorestart=true #程式退出後自動重新開機,可選值:[unexpected,true,false],預設為unexpected,表示程序意外殺死後才重新開機stopasgroup=true;程序被殺死時,是否向這個程序組發送stop信号,包括子程序
user=root #執行程序的使用者
startsecs = 1 #自動重新開機時間間隔(s)
numprocs=1 #程序數
redirect_stderr=true #是否重定向錯誤日志至輸出日志
stdout_logfile=/etc/supervisord.d/logs/test.log #标準輸出日志 注意:要建立logs檔案夾,test.log會自動生成,但是logs檔案夾需要手動建,否則會報錯
校驗配置檔案是否有修改
更新配置
檢視supervisor狀态
supervisorctl status
test RUNNING pid 2470, uptime 0:00:01
或者檢視要管理的程序是否啟動,本例中可以使用下面的指令
ps -ef | grep test
root 2195 2105 6 18:57 ? 00:00:00 /usr/local/php/bin/php /mnt/hgfs/project/www/blog/artisan command:test
root 2203 1186 0 18:57 pts/0 00:00:00 grep --color=auto test
重新啟動配置中所有程式
supervisorctl reload
停止所有程式
supervisorctl stop all
配置supervisor web管理界面
#第一步 進入配置檔案
vi /etc/supervisord.conf
#第二步 把下面配置分号去掉
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0: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 reload
浏覽器通路 192.168.22.3:9001 (注:筆者是本地通路虛拟機環境)