Linux安裝supervisor:一個進程控制系統

文章目錄

Supervisor:一個進程控制系統
Supervisor是一個客戶端/服務系統,允許其用戶監控和控制類似UNIX的操作系統上的多個進程。
它具有一些相同的目的的程序,例如launchddaemontoolsrunit。與這些程序中的某些程序不同,它不打算作爲“進程ID 1”的替代init運行。相反,它打算用於控制與項目或客戶相關的進程,並且打算在啓動時像任何其它程序一樣啓動。

知道你們時間寶貴,看第一節應該就能滿足你們的需要。如果想多瞭解Supervisor的話,比如一些具體配置,可以看後面幾節。

0.使用Supervisor

0.1安裝

Supervisor是用Python寫的,安裝pip

[root@solang ~]# yum -y install epel-release
[root@solang ~]# yum -y install python-pip

# CentOS默認安裝pip版本8.1.2,可先升級pip
[root@solang ~]# pip install --upgrade pip

# 此命令會將supervisor安裝在`~/.local`目錄下
[root@solang ~]$ pip install supervisor

不想安裝pip或不想安裝在~/.local目錄,可以下載supervisor-4.2.0.tar.gz,解壓

[solang@solang ~]$ tar -zxf supervisor-4.2.0.tar.gz -C /usr/local/

# 切換root
[root@solang ~]$ cd /usr/local/supervisor-4.2.0/

[root@solang supervisor-4.2.0]# python setup.py install

# 編譯後會多出兩個目錄,其它文件或目錄可以刪除
[solang@solang supervisor-4.2.0]$ ll

drwxr-xr-x. 4 root      root         43 May 15 14:57 build
drwxr-xr-x. 2 root      root         40 May 15 14:57 dist

root用戶執行將主配置文件放到/usr/etc/目錄

[root@solang ~]# echo_supervisord_conf > /usr/etc/supervisord.conf

# 賦予讀寫權限
[root@solang ~]# chmod 646 /usr/etc/supervisord.conf

0.2配置supervisord.conf

切換到普通用戶,根據需要修改,user=solang建議一定要配置,會以普通用戶啓動supervisord。[include]部分一定要配置,用於訪問自定義程序的配置。

[solang@solang ~]$ vi /usr/etc/supervisord.conf

[unix_http_server]
file=/usr/local/supervisor-4.2.0/supervisor.sock

# 若需要web UI訪問,打開並配置
[inet_http_server]         
port=192.168.86.100:9001       
username=user              
password=123 

[supervisord]
logfile=/usr/local/supervisor-4.2.0/supervisord.log
pidfile=/usr/local/supervisor-4.2.0/supervisord.pid
user=solang

[supervisorctl]
serverurl=unix:///usr/local/supervisor-4.2.0/supervisor.sock

[include]
files = /usr/local/supervisor-4.2.0/config/*.config

保存後,創建[include]部分的路徑

# 創建目錄,將程序文件放到config目錄下
[solang@solang ~]$ midir /usr/local/supervisor-4.2.0/config

0.3啓動supervisord

# 啓動supervisord
[solang@solang ~]$ supervisord

[solang@solang aaa]$ supervisord -v
4.2.0

[solang@solang ~]$ cd /usr/local/supervisor-4.2.0/config

0.4啓動Elasticsearch

[solang@solang config]$ vi elasticsearch.config

[program:Elasticsearch]
command=/usr/local/elasticsearch-6.6.2/bin/elasticsearch
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/elasticsearch/elasticsearch.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/elasticsearch/elasticsearch.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

這裏面有3個坑,按上面配置啓動不起來

1.配置的日誌目錄必須要存在

[solang@solang config]$ mkdir -p /usr/local/logs/elasticsearch

2.設置JAVA_HOME路徑

這時啓動elasticsearch仍然啓動不起來

[solang@solang config]$ supervisorctl update

# 監控日誌報錯,啓動不起來
[solang@solang config]$ tail -f /usr/local/supervisor-4.2.0/supervisord.log

INFO spawned: 'Elasticsearch' with pid 1711
INFO exited: Elasticsearch (exit status 1; not expected)
INFO gave up: Elasticsearch entered FATAL state, too many start retries too quickly

這時要去配置的日誌輸出目錄查看

[solang@solang config]$ cat /usr/local/logs/elasticsearch/elasticsearch.log

which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
could not find java; set JAVA_HOME or ensure java is in PATH

要設置JAVA_HOME路徑,Linux系統中設置的不起作用。

# 增加environment環境變量設置
[solang@solang config]$ vi elasticsearch.config

[program:Elasticsearch]
command=/usr/local/elasticsearch-6.6.2/bin/elasticsearch
environment=JAVA_HOME="/usr/local/jdk1.8.0_251"
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/elasticsearch
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/elasticsearch
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

3.配置文件描述符數和線程數

這時啓動elasticsearch仍然啓動不起來

[solang@solang config]$ supervisorctl update


[solang@solang config]$ cat /usr/local/logs/elasticsearch/elasticsearch.log

[INFO ][o.e.t.TransportService   ] [W5S_8e6] publish_address {192.168.86.100:9300}, bound_addresses {192.168.86.100:9300}
[INFO ][o.e.b.BootstrapChecks    ] [W5S_8e6] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max number of threads [3795] for user [solang] is too low, increase to at least [4096]
[INFO ][o.e.n.Node               ] [W5S_8e6] stopping ...

這個錯誤在安裝Elasticsearch時遇到過,但是安裝的時候我們文件描述符數和線程數都配置了,肯定就是supervisord要配置了。

修改/usr/etc/supervisord.conf主配置文件,在[supervisord]部分增加配置。

[solang@solang ~]$ vi /usr/etc/supervisord.conf

[supervisord]
minfds=65536
minprocs=4096

由於修改了主配置文件,supervisord需要重啓。坑又來了,執行supervisorctl reload,發現子進程(即config目錄下配置文件)重啓了,supervisord並沒有重啓,使用kill命令殺進程。

[solang@solang ~]$ supervisorctl reload

[solang@solang ~]$ ps -ef | grep supervisord

solang   1490      1  0 18:24 ?        00:00:01 /usr/bin/python /usr/bin/supervisord
solang   2007   1969  0 19:37 pts/4    00:00:00 grep --color=auto supervisord

[solang@solang ~]$ kill -9 1490

[solang@solang ~]$ supervisord

# 查看子進程狀態
[solang@solang ~]$ supervisorctl status

殺完進程再重新啓動supervisord,發現Elasticsearch啓動成功了。

注意:startsecs=60,這個時間儘量設置的大一些,在配置supervisord的文件描述符數和線程數之前,這個鍵設置的值是3,然後在supervisord.log的輸出日誌上Elasticsearch啓動成功後3s時間supervisord就以爲Elasticsearch啓動成功了,結果後面遇到了文件描述符數和線程數不夠的問題。

另外,這裏的優先級priority=998,因爲後面要啓動Kibana,Elasticsearch肯定要比Kibana優先啓動。

0.5啓動Kibana

[solang@solang config]$ mkdir -p /usr/local/logs/kibana

[solang@solang config]$ vi kibana.config 

[program:kibana]
command=/usr/local/kibana-6.6.2/bin/kibana
priority=999
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/kibana/kibana.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/kibana/kibana.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

配置完成後,啓動Kibana

[solang@solang config]$ supervisorctl update

0.6啓動Redis

[solang@solang config]$ mkdir -p /usr/local/logs/redis-6.0.1

[solang@solang config]$ vi redis.config 

[program:redis]
command=/usr/local/bin/redis-server /usr/local/redis-6.0.1/redis.conf
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/redis-6.0.1/redis.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/redis-6.0.1/redis.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

注意: 這裏的坑主要是command鍵配置的命令要以前臺方式啓動。redis.conf配置文件的中的daemonize改爲no就行,如果沒改動過,默認就是no

[solang@solang ~]$ vi /usr/local/redis-6.0.1/redis.conf

# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no

這裏設置priority=998,因爲後面要啓動redis監控工具RedisInsight,redis肯定要比RedisInsight優先啓動。

配置完成後,啓動redis

[solang@solang config]$ supervisorctl update

0.7啓動RedisInsight

[solang@solang config]$ mkdir -p /usr/local/logs/redisinsight

[solang@solang config]$ vi redisinsight.config 

[program:redisinsight]
command=/usr/local/redisinsight-1.4.0/redisinsight-linux64-1.5.0
priority=999
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/redisinsight/redisinsight.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/redisinsight/redisinsight.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

配置完成後,啓動RedisInsight

[solang@solang config]$ supervisorctl update

0.8訪問Web UI

瀏覽器訪問http://192.168.86.100:9001/,輸入配置的用戶名和密碼,可管理查看進程的運行狀態。
Supervisor web UI運行狀態

0.9開機啓動supervisord

[root@solang ~]# vi /usr/lib/systemd/system/supervisord.service

# supervisord service for systemd (CentOS 7.0+)
# by ET-:CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
User=solang
ExecStart=/usr/bin/supervisord -c /usr/etc/supervisord.config
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target


[root@solang ~]# chmod 664 /usr/lib/systemd/system/supervisord.service

# 設置指定的服務開機啓動
[root@solang ~]# systemctl enable supervisord 

# 查看指定的服務是否開機啓動
[root@solang ~]# systemctl is-enabled supervisord

# 設置指定的服務開機不啓動
[root@solang ~]# systemctl disable supervisord       

開機啓動設置後,執行reboot

[root@solang ~]# reboot

查看supervisord的進程,發現並不存在。

嘗試手動執行啓動,發現出錯

[root@solang ~]# systemctl start supervisord
Job for supervisord.service failed because the control process exited with error code. See "systemctl status supervisord.service" and "journalctl -xe" for details.

[root@solang ~]# journalctl -xe

solang systemd[1]: supervisord.service failed.
solang systemd[1]: supervisord.service holdoff time over, scheduling restart.
solang systemd[1]: Stopped Supervisor daemon.
-- Subject: Unit supervisord.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit supervisord.service has finished shutting down.
solang systemd[1]: Starting Supervisor daemon...
-- Subject: Unit supervisord.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit supervisord.service has begun starting up.
solang supervisord[1285]: Error: The minimum number of file descriptors required to run this process is 65536 as per the "minfds" command-line argument or config file setting. The current environment will only allow you to open 65536 file descriptors.
solang supervisord[1285]: For help, use /usr/bin/supervisord -h
solang systemd[1]: supervisord.service: control process exited, code=exited status=2
solang systemd[1]: Failed to start Supervisor daemon.
-- Subject: Unit supervisord.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit supervisord.service has failed.
-- 
-- The result is failed.
solang systemd[1]: Unit supervisord.service entered failed state.
solang systemd[1]: supervisord.service failed.
solang polkitd[696]: Registered Authentication Agent for unix-process:1289:27511 (system bus name :1.23 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)

錯誤:根據“minfds”命令行參數或配置文件設置,運行此進程所需的文件描述符的最小數量爲65536。當前環境僅允許你打開65536個文件描述符。

當然,這個錯誤的文件描述符數量是在啓動Elasticsearch時設置的。本人將系統的文件描述符數量擴大,執行systemctl start supervisord仍然報錯。搞了好久,仍然沒有解決方案,希望閱讀到此處的小夥伴有解決方案時告知,共同進步吧。(PS:一般情況下是不會重啓機器的,當然重啓後手動啓動supervisord也可以)

0.10常用命令

supervisorctl status                //查看所有進程的狀態
supervisorctl stop process_name     //停止
supervisorctl start process_name    //啓動
supervisorctl restart process_name  //重啓
supervisorctl update                //配置文件修改後使用該命令加載新的配置
supervisorctl reload                //重新啓動配置中的所有程序

1.介紹

1.1概述

Supervisor是一個客戶端/服務系統,允許其用戶控制類似UNIX的操作系統上的多個進程。它受到以下方面的啓發:

1.1.1方便

需要爲每個單進程實例編寫rc.d腳本通常很不方便。rc.d腳本是進程初始化/自動啓動/管理的一個很好的最基本形式,但是編寫和維護它們可能很麻煩。此外,rc.d腳本不能自動重新啓動崩潰的進程,並且許多程序在崩潰時不能正確地自行重啓。Supervisord將進程作爲其子進程啓動,並且可以配置爲在崩潰時自動重新啓動它們。它也可以將其自動配置爲自行調用啓動進程。

1.1.2準確性

在UNIX上,通常很難獲得進程準確的啓動/關閉狀態。Pidfile經常說謊。Supervisord將進程作爲子進程啓動,因此它始終了解其子進程的真實啓動/關閉狀態,並且可以方便地查詢這些數據。

1.1.3委託

需要控制進程狀態的用戶通常只需要這樣做。他們不想或不需要完整的Shell訪問運行這些進程的計算機。監聽“低”TCP端口的進程通常需要以root用戶(UNIX錯誤特性)身份啓動和重新啓動。通常情況下,允許“普通”用戶停止或重新啓動這樣的進程是完全可以的,但是爲他們提供shell訪問權限通常是不切實際的,並且爲他們提供root訪問權限或sudo訪問權限通常是不可能的。也很難(正確)向他們解釋爲什麼存在此問題。如果supervisord是以root用戶身份啓動的,則可以允許“普通”用戶控制此類進程,而無需向他們解釋問題的複雜性。Supervisorctl允許以非常有限的方式訪問計算機,實質上是允許用戶通過從簡單的Shell或Web UI發出“stop”、“start”和“restart”命令來查看進程狀態並控制受supervisord監督的子進程。

1.1.4進程組

進程通常需要以組的形式啓動和停止,有時甚至需要按照“優先級順序”進行。通常很難向人們解釋如何做。Supervisor允許你爲進程分配優先級,並允許用戶通過supervisorctl客戶端發出命令,如“start all”和“restart all”,這將按照預先分配的優先級順序啓動它們。此外,可以將進程分組到“進程組”中,並且可以將一組邏輯相關的進程作爲一個單元停止和啓動。

1.2特性

1.2.1簡單

Supervisor通過一個簡單易學的INI風格配置文件進行配置。它提供了許多每個進程的選項,使你的工作變得更輕鬆,例如重新啓動失敗的進程和自動日誌輪換。

1.2.2集中

Supervisor爲你提供了一個啓動、停止和監控進程的地方。進程可以單獨或按組控制。你可以配置Supervisor以提供本地或遠程命令行和Web界面。

1.2.3高效的

Supervisor通過fork/exec啓動其子進程,並且子進程不進行守護進程。進程終止時,操作系統會立即向Supervisor發送信號,這與某些依賴麻煩的PID文件和定期輪詢來重新啓動失敗的進程的解決方案不同。

1.2.4可擴展的

Supervisor具有一個簡單的事件通知協議,該協議可以使用任何語言編寫的程序對其進行監控,還有一個用於控制的XML-RPC接口。Python開發人員可以利用這些擴展點構建。

1.2.5兼容性

除Windows外,Supervisor幾乎適用於所有其它方面。它已在Linux、Mac OS X、Solaris和FreeBSD上經過測試和支持。它完全用Python編寫,因此安裝不需要C編譯器。

1.2.6久經考驗

儘管Supervisor如今非常活躍,但它不是新軟件。Supervisor已經存在了多年,並且已經在許多服務上使用。

1.3Supervisor組件

1.3.1supervisord

supervisor的服務部分被稱爲supervisord。它負責自行調用啓動子程序,響應來自客戶端的命令,重新啓動崩潰或退出的子進程,記錄其子進程stdoutstderr輸出以及生成和處理與子進程生命週期中的點相對應的“事件”。

服務進程使用配置文件。它通常位於/etc/supervisord.conf中。此配置文件是“Windows-INI”風格的配置文件。通過適當的文件系統權限來確保此文件的安全很重要,因爲它可能包含未加密的用戶名和密碼。

1.3.2supervisorctl

supervisor的命令行客戶端部分被稱爲supervisorctl。它爲supervisord提供的特性提供了類似於shell的界面。從supervisorctl,用戶可以連接到不同的supervisord進程(一次一個),獲取由其控制的子進程的狀態,停止和啓動子進程,以及獲取supervisord正在運行的進程列表。

命令行客戶端通過UNIX域套接字或Internet(TCP)套接字與服務對話。服務可以斷言客戶端的用戶應在允許客戶端執行命令之前出示身份驗證憑據。客戶端進程通常使用與服務相同的配置文件,但是任何帶有[supervisorctl]部分的配置文件都可以工作。

1.3.3網絡服務

如果針對Internet套接字啓動supervisord,則可以通過瀏覽器訪問功能類似於supervisorctl的(稀疏)Web用戶界面。激活配置文件的[inet_http_server]部分後,訪問服務URL(例如http://localhost:9001/)以通過Web界面查看和控制進程狀態。

1.3.4XML-RPC接口

爲Web UI提供服務的同一HTTP服務提供了一個XML-RPC接口,該接口可用於詢問和控制supervisor及其運行的程序。請參閱XML-RPC API文檔

1.4平臺要求

Supervisor已經經過測試,已知可以在Linux (Ubuntu 9.10)、Mac OS X (10.4/10.5/10.6)、Solaris (10 for Intel)和FreeBSD 6.1上運行。它可能在大多數UNIX系統上運行良好。

Supervisor完全不會在任何Windows版本下運行。

Supervisor使用於在Python 3版本3.4或更高版本以及Python 2版本2.7上工作。

2.安裝

安裝說明取決於你試圖安裝Supervisor的系統是否具有網絡訪問權限。

2.1安裝到有網絡訪問權限的系統

2.1.1使用Pip命令的網絡安裝

可以使用pip install安裝Supervisor:

pip install supervisor

取決於系統的Python的權限,你可能需要成爲root用戶才能使用pip成功安裝Supervisor。

你還可以通過pip在虛擬環境中安裝supervisor。

2.1.2沒有Pip命令的網絡安裝

如果你的系統未安裝pip,則需要下載Supervisor發行版並手動安裝。當前和以前的Supervisor版本可以從PyPi下載。解壓縮軟件存檔後,運行python setup.py install。這需要互聯網訪問。它將下載並安裝Supervisor依賴的所有發行版,最後安裝Supervisor本身。

注意:
取決於系統的Python的權限,你可能需要成爲root用戶才能成功調用python setup.py install

2.2安裝到無法訪問網絡的系統

如果你想安裝Supervisor的系統沒有網絡訪問權限,則你需要以稍微不同的方式執行安裝。由於pippython setup.py install都依賴於網絡訪問來執行依賴軟件的下載,因此在安裝依賴項之前,這兩種方法都不能在沒有網絡訪問的機器上工作。要安裝到未聯網的機器上,獲得對已聯網的機器的以下依賴關係:

將這些文件複製到可移動介質,然後將它們放在目標計算機上。按照說明將它們分別安裝到目標計算機上。這通常僅意味着解壓縮每個文件並在解壓目錄中調用python setup.py install。最後,運行supervisor的python setup.py install

注意:
取決於系統的Python的權限,你可能需要成爲root用戶才能成功爲每個包調用python setup.py install

2.3安裝發行包

一些Linux發行版提供了可通過系統包管理器安裝的Supervisor版本。這些包是由第三方(而非Supervisor開發人員)製作的,並且通常包括針對Supervisor的特定於發行版的更改。

使用發行版的包管理工具來檢查可用性;例如,在Ubuntu上,你可以運行apt-cache show supervisor,在CentOS上,你可以運行yum info supervisor

Supervisor發行包的一個特性是,它們通常將集成到分發的服務管理基礎架構中,例如,允許supervisord在系統啓動時自動啓動。

注意:
Supervisor的發行包可能遠遠落後於發佈到PyPI的官方Supervisor包。例如,Ubuntu 12.04(2012年4月發佈)提供了基於Supervisor 3.0a8(2010年1月發佈)的包。

注意:
用戶反映,適用於Ubuntu 16.04的Supervisor發行包的行爲與以前的版本不同。在Ubuntu 10.04、12.04和14.04上,安裝包會將系統配置爲在系統啓動時啓動supervisord。在Ubuntu 16.04上,該包的初始發行版並未做到這一點。該包後來被修復。有關更多信息,請參見Ubuntu Bug #1594740

2.4創建配置文件

Supervisor安裝完成後,運行echo_supervisord_conf。這會將“示例”Supervisor配置文件打印到終端的標準輸出。

一旦看到文件回顯到終端,請以echo_supervisord_conf > /etc/supervisord.conf重新調用命令。如果你沒有root訪問權限,則此操作將無效。

如果你沒有root訪問權限,或者你不希望將supervisord.conf文件放在/etc/supervisord.conf中,則可以將其放置在當前目錄(echo_supervisord_conf > supervisord.conf)中,並使用-c標誌啓動supervisord以指定配置文件位置。

例如,supervisord -c supervisord.conf。在這種情況下,使用-c標誌實際上是多餘的,因爲supervisord在搜索任何其它位置的文件之前會先在當前目錄中搜索supervisord.conf,但是它會起作用。有關-c標誌的更多信息,請參見3.運行Supervisor

在文件系統上擁有配置文件後,你可以根據自己的喜好開始對其進行修改。

3.運行Supervisor

本節在解釋如何運行supervisordsupervisorctl命令時參考了BINDIR。這是配置Python安裝的“bindir”目錄。例如,對於通過./configure --prefix=/usr/local/py; make; make install安裝的Python安裝,BINDIR將是/usr/local/py/bin。不同平臺上的Python解釋器使用不同的BINDIR。如果無法確定你的位置,查看setup.py install的輸出。

3.1添加程序

要使supervisord對你有所幫助,你需要在其配置中至少添加一個program部分。program部分將定義一個在調用supervisord命令時運行和管理的程序。要添加程序,你需要編輯supervisord.conf文件。

UNIX cat程序是可能運行的最簡單的程序之一。下面顯示了在supervisord進程啓動時將運行catprogram部分。

[program:foo]
command=/bin/cat

該節可以被剪切並粘貼到supervisord.conf文件中。這是最簡單的程序配置,因爲它僅命名一個命令。程序配置部分還有許多其它配置選項,此處未顯示。有關更多信息,請參見4.6[program:x]設置

3.2運行supervisord

要啓動supervisord,請運行$BINDIR/supervisord。生成的進程將自身守護進程並與終端分離。默認情況下,它會將操作日誌保留在$CWD/supervisor.log中。

你可以通過在命令行中傳遞-n標誌來在前臺啓動可執行的supervisord。這對於調試啓動問題很有用。

警告:

supervisord啓動時,它將在默認位置(包括當前工作目錄)搜索其配置文件。如果你注重安全性,則可能需要在supervisord命令後指定“ -c”參數,以指定配置文件的絕對路徑,以確保不會有人誘騙你從包含流氓supervisord.conf文件的目錄中運行supervisor。當supervisor以root身份啓動而沒有此-c參數時,將發出警告。

要更改受supervisord控制的程序集,請編輯supervisord.conf文件並kill -HUP或以其它方式重新啓動supervisord進程。該文件具有幾個示例程序定義。

supervisord命令接受許多命令行選項。這些命令行選項中的每個選項都會覆蓋配置文件中的任何等效值。

3.2.1supervisord命令行選項

命令 描述
-c FILE, --configuration=FILE supervisord配置文件的路徑
-n, --nodaemon 在前臺運行supervisord
-s, --silent 沒有指向到stdout的輸出
-h, --help 顯示supervisord命令行幫助
-u USER, --user=USER UNIX用戶名或數字用戶標識。如果supervisord以root用戶啓動,在啓動過程中儘快對此用戶setuid。
-m OCTAL, --umask=OCTAL 代表supervisord啓動後應使用的umask的八進制數字(例如022)。
-d PATH, --directory=PATH 當supervisord作爲守護進程運行時,在守護進程運行之前,cd到該目錄。
-l FILE, --logfile=FILE 用作supervisord活動日誌的文件名路徑。
-y BYTES, --logfile_maxbytes=BYTES 輪換髮生之前,supervisord活動日誌文件的最大大小。該值後綴相乘,例如“1”是一個字節,“1MB”是1兆字節,“1GB”是1千兆字節。
-z NUM, --logfile_backups=NUM 要保留的supervisord活動日誌的備份副本數。每個日誌文件的大小爲logfile_maxbytes
-e LEVEL, --loglevel=LEVEL supervisor應將其寫入活動日誌的日誌記錄級別。有效級別爲tracedebuginfowarnerrorcritical
-j FILE, --pidfile=FILE supervisord應寫入其pid文件的文件名。
-i STRING, --identifier=STRING 各種客戶端UI爲此supervisor的實例公開的任意字符串標識符。
-q PATH, --childlogdir=PATH supervisor將在其中寫入其AUTO模式子進程日誌的目錄路徑(該目錄必須已經存在)。
-k, --nocleanup 防止supervisord在啓動時執行清理(刪除舊的AUTO進程日誌文件)。
-a NUM, --minfds=NUM 成功啓動supervisord進程之前,其必須可用的最小文件描述符數目。
-t, --strip_ansi 從所有子日誌進程中刪除ANSI轉義序列。
-v, --version 將supervisord的版本號輸出到stdout並退出。
–profile_options=LIST 用於分析的逗號分隔選項列表。使supervisord在分析器下運行,並基於選項輸出結果,這些選項是逗號分隔的以下列表:cumulative, calls, callers。例如cumulative,callers
–minprocs=NUM 成功啓動supervisord進程之前,其必須可用的最小OS進程插槽數目。

3.3運行supervisorctl

要啓動supervisorctl,運行$BINDIR/supervisorctl。將顯示一個shell,允許你控制當前由supervisord管理的進程。在提示符下鍵入“help”以獲取有關受支持的命令的信息。

當從命令行使用參數調用supervisorctl可執行文件時,可以使用“一次性”命令來調用。例如:supervisorctl stop all。如果命令行中存在參數,則將阻止交互式shell的調用。相反,該命令將被執行,supervisorctl將退出,以0表示成功或正在運行,而非零表示錯誤。例如:如果任何單個進程沒有在運行,supervisorctl status all將返回非零。

如果在交互模式下對需要身份驗證的supervisord調用supervisorctl,則會要求你提供身份驗證憑據。

3.3.1supervisorctl命令行選項

命令 描述
-c, --configuration 配置文件路徑(默認爲/etc/supervisord.conf
-h, --help 打印用法信息並退出
-i, --interactive 執行命令後啓動交互式Shell
-s, --serverurl URL supervisord服務正在監聽的URL(默認爲“http://localhost:9001”)。
-u, --username 用於服務身份驗證的用戶名
-p, --password 用於服務驗證的密碼
-r, --history-file 保留readline歷史記錄(如果readline可用)

action [arguments]

操作是諸如“tail”或“stop”之類的命令。如果在命令行上指定-i或未指定任何操作,則將啓動一個交互式類型解釋操作"shell"。使用操作“help”查找可用操作。

3.3.2supervisorctl操作

命令 描述
help 打印可用操作列表
help <action> 打印<action>的幫助
add <name> [...] 激活進程/組配置中的任何更新
remove <name> [...] 從活動配置中刪除進程/組
update 重新加載配置並根據需要添加/刪除,並將重新啓動受影響的程序
update all 重新加載配置並根據需要添加/刪除,並將重新啓動受影響的程序
update <gname> [...] 更新特定的組,並將重新啓動受影響的程序
clear <name> 清除進程的日誌文件。
clear <name> <name> 清除多個進程的日誌文件
clear all 清除所有進程的日誌文件
fg <process> 在前臺模式下連接到進程按Ctrl+C退出前臺
pid 獲取supervisord的PID
pid <name> 通過名稱獲取單個子進程的PID
pid all 獲取每個子進程的PID,每行一個
reload 重新啓動遠程supervisord
reread 重新加載守護進程的配置文件,而不添加/刪除(不重新啓動)
restart <name> 重新啓動進程注意:重新啓動不會重新讀取配置文件。爲此,請參閱reread和update
restart <gname>:* 重新啓動組中的所有進程注意:重新啓動不會重新讀取配置文件。爲此,請參閱reread和update
restart <name> <name> 重新啓動多個進程或組注意:重新啓動不會重新讀取配置文件。爲此,請參閱reread和update
restart all 重新啓動所有進程注意:重新啓動不會重新讀取配置文件。爲此,請參閱reread和update
signal 沒有幫助的信號
start <name> 啓動一個進程
start <gname>:* 啓動組中的所有進程
start <name> <name> 啓動多個進程或組
start all 啓動所有進程
status 獲取所有進程狀態信息
status <name> 通過名稱獲取單個進程的狀態
status <name> <name> 獲取多個命名進程的狀態
stop <name> 停止一個進程
stop <gname>:* 停止組中的所有進程
stop <name> <name> 停止多個進程或組
stop all 停止所有進程
tail [-f] <name> [stdout|stderr] (default stdout) 輸出進程日誌的最後部分,例如:tail -f <name>命名進程連續在尾部stdout,Ctrl+C退出。tail -100 <name>進程的最後100個字節stdout;tail <name> stderr進程的最後1600個字節stderr

3.4信號

supervisord程序可能會被髮送信號,導致其在運行時執行某些操作。

你可以將任何這些信號發送到單個supervisord進程ID。此進程ID可以在配置文件的[supervisord]部分的pidfile參數表示的文件中找到(默認爲$CWD/supervisord.pid)。

3.4.1信號處理

信號 描述
SIGTERM supervisord及其所有子進程將關閉。這可能需要幾秒鐘。
SIGINT supervisord及其所有子進程將關閉。這可能需要幾秒鐘。
SIGQUIT supervisord及其所有子進程將關閉。這可能需要幾秒鐘。
SIGHUP supervisord將停止所有進程,從找到的第一個配置文件中重新加載配置,並啓動所有進程。
SIGUSR2 supervisord將關閉並重新打開主活動日誌和所有子日誌文件。

3.5運行時安全

開發人員已盡最大努力確保使用以root身份運行的supervisord進程不會導致意外的權限升級。但是使用者自慎。Supervisor不像DJ Bernstein的daemontools那樣偏執,因爲supervisord允許在其配置文件中寫入任意路徑規範。允許選擇任意路徑會導致符號鏈接攻擊產生漏洞。在配置中指定路徑時要小心。確保無權限用戶無法讀取或寫入supervisord配置文件,並且由supervisor程序包安裝的所有文件都具有“合理的”文件權限保護設置。此外,請確保你的PYTHONPATH合理,並且所有Python標準庫文件都具有足夠的文件權限保護。

3.6啓動時自動啓動supervisord

如果你使用的是發行版打包的Supervisor,則應該已經將其集成到發行版的服務管理基礎結構中。

以下是用戶貢獻的各種操作系統的腳本:

https://github.com/Supervisor/initscripts

萬一你遇到麻煩,Serverfault上有一些答案:如何在Linux(Ubuntu)上自動啓動supervisord

4.配置文件

Supervisor配置文件通常被命名爲supervisord.confsupervisordsupervisorctl都使用它。如果在沒有-c選項的情況下啓動了任何一個應用程序(該選項用於顯式告知應用程序配置文件名),則該應用程序將在以下位置按指定順序查找名爲supervisord.conf的文件。它將使用找到的第一個文件。

  1. ../etc/supervisord.conf (相對於可執行文件,例/usr/etc/supervisord.conf)
  2. ../supervisord.conf (相對於可執行文件,例/usr/supervisord.conf)
  3. $CWD/supervisord.conf
  4. $CWD/etc/supervisord.conf
  5. /etc/supervisord.conf
  6. /etc/supervisor/supervisord.conf (從Supervisor 3.3.0)

注意:
爲Debian和Ubuntu打包的許多版本的Supervisor都包含一個補丁,該補丁將/etc/supervisor/supervisord.conf添加到了搜索路徑。Supervisor的第一個PyPI軟件包包括它是Supervisor 3.3.0。

4.1文件格式

supervisord.conf是一個Windows-INI風格(Python ConfigParser)文件。它具有部分(每個部分由[header]表示)和部分內的鍵/值對。各部分及其允許值如下所述。

4.1.1環境變量

啓動supervisord時在環境中存在的環境變量,可以使用Python字符串表達式語法%(ENV_X)s在配置文件中使用:

[program:example]
command=/usr/bin/example --loglevel=%(ENV_LOGLEVEL)s

在上面的示例中,表達式%(ENV_LOGLEVEL)s將擴展爲環境變量LOGLEVEL的值。

注意:
在Supervisor 3.2和更高版本中,所有選項均支持%(ENV_X)s表達式。在以前的版本中,有些選項支持它們,但大多數不支持。請參閱下面每個選項的文檔。

4.2[unix_http_server]設置

supervisord.conf文件包含名爲[unix_http_server]的部分,在該部分下應插入在UNIX域套接字上監聽的HTTP服務的配置參數。如果配置文件中沒有[unix_http_server]部分,則不會啓動UNIX域套接字HTTP服務。允許的配置值如下。

4.2.1[unix_http_server]

4.2.1.1file

supervisor將在UNIX域套接字上偵聽HTTP/XML-RPC請求的路徑。supervisorctl使用XML-RPC通過該端口與supervisord通信。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。

默認值:無。
必填:否。
介紹:3.0

警告:
echo_supervisord_conf輸出的示例配置使用/tmp/supervisor.sock作爲套接字文件。該路徑僅是示例,可能需要將其更改爲更適合你的系統的位置。某些系統會定期刪除/tmp中的舊文件。如果套接字文件被刪除,supervisorctl將無法連接到supervisord

4.2.1.2chmod

在啓動時,將UNIX域套接字的UNIX權限模式位更改爲該值。

默認值0700
必填:否。
介紹:3.0

4.2.1.3chown

將套接字文件的用戶和組更改爲此值。可以是UNIX用戶名(例如chrism)或以冒號分隔的UNIX用戶名和組(例如chrism:wheel)。

默認值:使用啓動supervisord的用戶名和用戶組。
必填:否。
介紹:3.0

4.2.1.4username

對此HTTP服務進行身份驗證所需的用戶名。

默認值:無需用戶名。
必填:否。
介紹:3.0

4.2.1.5password

對此HTTP服務進行身份驗證所需的密碼。這可以是明文密碼,也可以指定爲SHA-1哈希(如果以字符串{SHA}爲前綴)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d是密碼“thepassword”的SHA存儲版本。

注意,哈希密碼必須爲十六進制格式。

默認值:無需密碼。
必填:否。
介紹:3.0

4.2.2[unix_http_server]示例

[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123

4.3[inet_http_server]設置

supervisord.conf文件包含名爲[inet_http_server]的部分,在該部分下應插入監聽TCP(internet)套接字的HTTP服務的配置參數。如果配置文件沒有[inet_http_server]部分,則不會啓動inet HTTP服務。允許的配置值如下。

警告:
默認情況下,未啓用inet HTTP服務。如果選擇啓用它,請閱讀以下安全警告。inet HTTP服務僅在受信任的環境中使用。它只應綁定到localhost或只能從隔離的、受信任的網絡中訪問。inet HTTP服務不支持任何形式的加密。默認情況下,inet HTTP服務不使用身份驗證(請參閱username=password=選項)。可以從supervisorctl遠程控制Inet HTTP服務。它還提供了一個Web界面,該界面允許啓動或停止子進程以及查看子進程日誌。切勿將inet HTTP服務暴露給公網。

4.3.1[inet_http_server]

4.3.1.1port

TCP host:port值(例如127.0.0.1:9001),supervisor將在該值上監聽HTTP/XML-RPC請求。supervisorctl將使用XML-RPC通過此端口與supervisord通信。要監聽機器中的所有接口,請使用:9001*:9001。請閱讀上面的安全警告。

默認值:無默認值。
必填:是。
介紹:3.0

4.3.1.2username

對此HTTP服務進行身份驗證所需的用戶名。

默認值:無需用戶名。
必填:否。
介紹:3.0

4.3.1.3password

對此HTTP服務進行身份驗證所需的密碼。這可以是明文密碼,也可以指定爲SHA-1哈希(如果以字符串{SHA}爲前綴)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d是密碼“thepassword”的SHA存儲版本。

注意,哈希密碼必須爲十六進制格式。

默認值:無需密碼。
必填:否。
介紹:3.0

4.3.2[inet_http_server]示例

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

4.4[supervisord]設置

supervisord.conf文件包含名爲[supervisord]的部分,應在其中插入與supervisord進程相關的全局設置。具體如下。

4.4.1[supervisord]

4.4.1.1logfile

supervisord進程的活動日誌的路徑。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。

注意:
如果將logfile設置爲不可查看的特殊文件(如/dev/stdout),則必須通過設置logfile_maxbytes = 0來禁用日誌輪換。

默認值$CWD/supervisord.log
必填:否。
介紹:3.0

4.4.1.2logfile_maxbytes

活動日誌文件在輪換之前可能消耗的最大字節數(值中可以使用“KB”、“MB”和“GB”之類的後綴乘法器)。將此值設置爲0表示日誌大小不受限制。

默認值:50MB。
必填:否。
介紹:3.0

4.4.1.3logfile_backups

活動日誌文件輪換產生要保留的備份數。如果設置爲0,將不保留任何備份。

默認值:10。
必填:否。
介紹:3.0

4.4.1.4loglevel

日誌記錄級別,指示要寫入supervisord活動日誌的內容。criticalerrorwarninfodebugtraceblather之一。注意,在日誌級別debug中,supervisord日誌文件將記錄其子進程的stderr/stdout輸出以及有關進程狀態更改的擴展信息,這對於調試未正常啓動的進程很有用。另請參閱:活動日誌級別

默認值:info。
必填:否。
介紹:3.0

4.4.1.5pidfile

supervisord保留其pid文件的位置。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。

默認值$CWD/supervisord.pid
必填:否。
介紹:3.0

4.4.1.6umask

supervisord進程的umask

默認值022
必填:否。
介紹:3.0

4.4.1.7nodaemon

如果爲true,則supervisor將在前臺啓動而不是以守護進程。

默認值:false。
必填:否。
介紹:3.0

4.4.1.8silent

如果爲true且未被守護,則日誌將不會定向到stdout。

默認值:false。
必填:否。
介紹:4.2.0

4.4.1.9minfds

成功啓動supervisord之前必須可用的文件描述符的最小數目。將調用setrlimit嘗試提高supervisord進程的軟限制和硬限制,以滿足minfds。僅當supervisord以root身份運行時,纔可以提高硬限制。supervisord不受限制地使用文件描述符,當無法從操作系統獲得文件描述符時,它將進入故障模式,因此能夠指定最小值以確保在執行期間不會耗盡它們是很有用的。這些限制將由託管子進程繼承。此選項在Solaris上特別有用,因爲Solaris默認情況下每個進程的fd限制較低。

默認值:1024。
必填:否。
介紹:3.0

4.4.1.10minprocs

成功啓動supervisord之前必須可用的進程描述符的最小數目。將調用setrlimit嘗試提高supervisord進程的軟限制和硬限制,以滿足minprocs。僅當supervisord以root身份運行時,纔可以提高硬限制。當操作系統的進程描述符用完時,supervisord將進入故障模式,因此確保supervisord啓動時有足夠的進程描述符可用是很有用的。

默認值:200。
必填:否。
介紹:3.0

4.4.1.11nocleanup

防止supervisord在啓動時清除任何現有的AUTO子日誌文件。對於調試很有用。

默認值:false。
必填:否。
介紹:3.0

4.4.1.12childlogdir

用於AUTO子日誌文件的目錄。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。

默認值:Python的tempfile.get_tempdir()的值。
必填:否。
介紹:3.0

4.4.1.13user

指示supervisord在執行任何有意義的處理之前將用戶切換到該UNIX用戶帳戶。如果以root用戶身份啓動supervisord,才能切換用戶。

默認值:不切換用戶。
必填:否。
介紹:3.0

已更改:3.3.4。如果supervisord無法切換到指定的用戶,它將向stderr寫入一條錯誤消息,然後立即退出。在早期版本中,它將繼續運行,但會在critical級別記錄一條消息。

4.4.1.14directory

supervisord守護進程時,切換到該目錄。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。

默認值:不cd。
必填:否。
介紹:3.0

4.4.1.15strip_ansi

從子日誌文件中刪除所有ANSI轉義序列。

默認值:false。
必填:否。
介紹:3.0

4.4.1.16environment

KEY="val",KEY2="val2"的形式的鍵/值對列表,這些鍵/值對將放置在supervisord進程的環境中(並因此放在其所有子進程的環境中)。此選項可以包含值%(here)s,該值將擴展到找到supervisord配置文件的目錄。包含非字母數字字符的值應加引號(例如KEY="val:123",KEY2="val,456")。否則,引號值是可選的,但建議使用。要轉義百分比字符,只需使用兩個(例如URI="/first%%20name")。注意,子進程將繼承用於啓動supervisord的shell的環境變量,但此處和程序的environment選項中重寫的變量除外。請參閱子進程環境

默認值:無值。
必填:否。
介紹:3.0

4.4.1.17identifier

RPC接口使用的此supervisor進程的標識符字符串。

默認值:supervisor。
必填:否。
介紹:3.0

4.4.2[supervisord]示例

[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = false
minfds = 1024
minprocs = 200
umask = 022
user = chrism
identifier = supervisor
directory = /tmp
nocleanup = true
childlogdir = /tmp
strip_ansi = false
environment = KEY1="value1",KEY2="value2"

4.5[supervisorctl]設置

該配置文件可以包含supervisorctl交互式shell程序的設置。下面列出了這些選項。

4.5.1[supervisorctl]

4.5.1.1serverurl

用於訪問supervisord服務的URL,例如http://localhost:9001。對於UNIX域套接字,使用unix:///absolute/path/to/file.sock

默認值http://localhost:9001
必填:否。
介紹:3.0

4.5.1.2username

傳遞給supervisord服務以進行身份驗證的用戶名。該名稱應與你試圖訪問的端口或UNIX域套接字的supervisord服務配置中的username相同。

默認值:無用戶名。
必填:否。
介紹:3.0

4.5.1.3password

傳遞給supervisord服務以進行身份驗證的密碼。這應該是你要訪問的端口或UNIX域套接字的supervisord服務配置中password的明文版本。該值不能作爲SHA哈希傳遞。與該文件中指定的其它密碼不同,它必須以明文形式提供。

默認值:無密碼。
必填:否。
介紹:3.0

4.5.1.4prompt

用作supervisorctl提示的字符串。

默認值supervisor
必填:否。
介紹:3.0

4.5.1.5history_file

用作readline永久歷史記錄文件的路徑。如果通過選擇路徑啓用此功能,則你的supervisorctl命令將保留在文件中,並且你可以使用readline(例如,向上箭頭)來調用你在上一個supervisorctl會話中執行的命令。

默認值:無文件。
必填:否。
介紹:3.0a5

4.5.2[supervisorctl]示例

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor

4.6[program:x]設置

配置文件必須包含一個或多個program部分,以便supervisord知道應該啓動和控制哪些程序。頭值是複合值。它是“program”一詞,緊接着是冒號,然後是程序名稱。頭值[program:foo]描述一個名稱爲“foo”的程序。該名稱用於控制該配置所創建的進程的客戶端應用程序。創建沒有名稱的program部分是錯誤的。名稱中不得包含冒號或括號字符。名稱的值用作%(program_name)s字符串表達式擴展在指定的其它值內的值。

注意:
[program:x]部分實際上代表supervisor的“同類進程組”(從3.0版開始)。該組的成員由配置中numprocsprocess_name參數的組合定義。默認情況下,如果numprocs和process_name保持默認值不變,則[program:x]表示的組將被命名爲x,並且其中將包含名爲x的單個進程。這提供了與較早的supervisor版本的向後兼容性,該版本不將程序部分視爲同類的進程組定義。

但是,例如,如果你有一個[program:foo]部分,其numprocs爲3,並且process_name表達式爲%(program_name)s_%(process_num)02d,則“foo”組將包含三個進程,名爲foo_00foo_01foo_02。這使得使用單個[program:x]部分啓動許多非常相似的進程成爲可能。所有日誌文件名稱、所有環境字符串以及程序命令也可以包含類似的Python字符串表達式,以便給每個進程傳遞略有不同的參數。

4.6.1[program:x]

4.6.1.1command

啓動該程序時將運行的命令。該命令可以是絕對命令(例如/path/to/programname),也可以是相對命令(例如programname)。如果是相對的,則將在supervisord的環境$PATH中搜索可執行文件。程序可以接受參數,例如/path/to/program foo bar。命令行可以使用雙引號將帶有空格的參數分組以傳遞給程序,例如/path/to/program/name -p "foo bar"。注意,command的值可能包含Python字符串表達式,例如/path/to/programname --port=80%(process_num)02d在運行時可能擴展爲/path/to/programname --port=8000。字符串表達式是根據包含鍵group_namehost_node_nameprogram_nameprocess_numnumprocshere(supervisord配置文件的目錄),以及所有supervisord的環境變量以ENV_開頭)的字典計算的。受控程序本身不應該是守護程序,因爲supervisord假設它負責守護其子進程(請參閱子進程的Nondaemonization)。

注意:
如果該命令看起來像一個配置文件註釋,則將被截斷。例如,command=bash -c 'foo ; bar'將被截斷爲command=bash -c 'foo。引號不會阻止此行爲,因爲配置文件讀取器不會像shell那樣解析命令。

默認值:無默認。
必填:是。
介紹:3.0

已更改:4.2.0。添加了對numprocs擴展的支持。

4.6.1.2process_name

一個Python字符串表達式,用於組成該進程的supervisor進程名稱。除非你更改numproc,否則通常無需擔心設置此配置。將根據包含 group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目錄)的字典對字符串表達式進行計算。

默認值%(program_name)s
必填:否。
介紹:3.0

4.6.1.3numprocs

Supervisor將啓動與numprocs命名的程序一樣多的實例。注意,如果numprocs > 1,則process_name表達式中必須包含%(process_num)s(或任何其它包含process_num的有效Python字符串表達式)。

默認值:1。
必填:否。
介紹:3.0

4.6.1.4numprocs_start

一個整數偏移量,用於計算numprocs的起始編號。

默認值:0。
必填:否。
介紹:3.0

4.6.1.5priority

程序在啓動和關閉順序中的相對優先級。較低的優先級表示程序在啓動時以及在各種客戶端中使用聚合命令時(例如“start all” /“stop all”)首先啓動,最後關閉的程序。較高的優先級表示程序最後啓動,然後首先關閉。

默認值:999。
必填:否。
介紹:3.0

4.6.1.6autostart

如果爲true,則在啓動supervisord時該程序將自動啓動。

默認值:true。
必填:否。
介紹:3.0

4.6.1.7startsecs

在啓動之後程序需要保持運行才能考慮啓動成功的總秒數(將進程從STARTING狀態移動到RUNNING狀態)。設置爲0表示該程序無需在任何特定時間內保持運行。

注意:
即使進程以“預期的”退出代碼(請參見exitcodes)退出,但如果該進程退出的速度比startsecs快,則啓動仍會被視爲失敗。

默認值:1。
必填:否。
介紹:3.0

4.6.1.8startretries

在放棄並使進程進入FATAL狀態之前,嘗試啓動程序時,supervisord將允許的串行失敗嘗試次數。有關FATAL狀態的說明,請參見進程狀態

默認值:3。
必填:否。
介紹:3.0

4.6.1.9autorestart

指定當supervisord處於RUNNING狀態時,如果退出是否應自動重啓該進程。可能是falseunexpectedtrue的其中之一。如果爲false,則該進程將不會自動重新啓動。如果爲unexpected,當程序退出時,退出代碼不是與此進程的配置相關的退出代碼之一(請參見exitcodes),則該進程將重新啓動。如果爲true,則退出時該進程將無條件重新啓動,而不考慮其退出代碼。

注意:
autorestart控制程序如果在成功啓動後退出(進程處於RUNNING狀態),supervisord是否會自動重啓程序。

進程啓動時(進程處於STARTING狀態),supervisord具有不同的重啓機制。進程啓動期間的重試由startsecsstartretries控制。

默認值:unexpected。
必填:否。
介紹:3.0

4.6.1.10exitcodes

autorestart一起使用的該程序的“預期”退出代碼列表。如果將autorestart參數設置爲unexpected,並且該進程以除supervisor停止請求之外的任何其他方式退出,則如果該進程退出且退出代碼未在此列表中定義,則supervisord將重新啓動該進程。

默認值:0。
必填:否。
介紹:3.0

注意:
在4.0之前的Supervisor版本中,默認值爲0,2。在Supervisor 4.0中,默認設置已更改爲0。

4.6.1.11stopsignal

請求停止時用於終止程序的信號。可以是TERM、HUP、INT、QUIT、KILL、USR1或USR2中的任何一個。

默認值:TERM。
必填:否。
介紹:3.0

4.6.1.12stopwaitsecs

在向程序發送停止信號後,等待操作系統將SIGCHLD返回給supervisord的秒數。如果supervisord在從進程中接收到SIGCHLD之前經過了此秒數,supervisord將嘗試使用最終SIGKILL殺死它。

默認值:10。
必填:否。
介紹:3.0

4.6.1.13stopasgroup

如果爲true,則該標誌使supervisor向整個進程組發送停止信號,並說明killasgroup爲true。這對於程序(例如調試模式下的Flask)非常有用,這些程序不會將停止信號傳播到其子級,而使它們成爲孤立狀態。

默認值:false。
必填:否。
介紹:3.0b1

4.6.1.14killasgroup

如果爲true,則在向程序發送SIGKILL終止時,將其發送給整個進程組,同時還要照顧其子進程,這對於使用multiprocessing的Python程序很有用。

默認值:false。
必填:否。
介紹:3.0a11

4.6.1.15user

指示supervisord使用此UNIX用戶帳戶作爲運行程序的帳戶。僅當supervisord以root用戶身份運行時才能切換用戶。如果supervisord無法切換到指定用戶,則該程序將不會啓動。

注意:
僅將使用setuid更改用戶。這不會啓動登錄Shell,也不會更改USERHOME之類的環境變量。有關詳細信息,請參見子進程環境

默認值:不切換用戶。
必填:否。
介紹:3.0

4.6.1.16redirect_stderr

如果爲true,則將進程的stderr輸出發送回其stdout文件描述符上的supervisord(以UNIX Shell術語來說,這等效於執行/the/program 2>&1)。

注意:

不要在[eventlistener:x]部分中設置redirect_stderr=true。事件監聽器Eventlisteners使用stdoutstdinsupervisord進行通信。如果重定向stderr,則stderr的輸出將干擾eventlistener協議。

默認值:false。
必填:否。
介紹:3.0,取代2.0的log_stdoutlog_stderr

4.6.1.17stdout_logfile

將進程stdout輸出放入此文件中(如果redirect_stderr爲true,也將stderr輸出放入該文件中)。如果未設置stdout_logfile或將其設置爲AUTO,則supervisor將自動選擇文件位置。如果將其設置爲NONE,則supervisord將不會創建任何日誌文件。supervisord重啓時,將刪除AUTO日誌文件及其備份。stdout_logfile值可以包含Python字符串表達式,該表達式將針對包含鍵group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目錄)的字典進行計算。

注意:
啓用輪換(stdout_logfile_maxbytes)時,兩個進程不可能共享一個日誌文件(stdout_logfile)。這將導致文件損壞。

注意:
如果將stdout_logfile設置爲不可查看的特殊文件(例如/dev/stdout),則必須通過設置stdout_logfile_maxbytes = 0來禁用日誌輪換。

默認值AUTO
必填:否。
介紹:3.0,取代2.0的logfile

4.6.1.18stdout_logfile_maxbytes

輪換stdout_logfile之前可能消耗的最大字節數(值中可以使用“KB”、“MB”和“GB”之類的後綴乘法器)。將此值設置爲0表示日誌大小不受限制。

默認值:50MB。
必填:否。
介紹:3.0,取代2.0的logfile_maxbytes

4.6.1.19stdout_logfile_backups

進程stdout日誌文件輪換產生要保留的stdout_logfile備份數。如果設置爲0,將不保留任何備份。

默認值:10。
必填:否。
介紹:3.0,取代2.0的logfile_backups

4.6.1.20stdout_capture_maxbytes

當進程處於“stdout捕獲模式”時,寫入捕獲FIFO的最大字節數(請參閱捕獲模式)。應爲整數(值中可以使用後綴乘數,例如“KB”,“MB”和“GB”)。如果該值爲0,則進程捕獲模式將關閉。

默認值:0。
必填:否。
介紹:3.0

4.6.1.21stdout_events_enabled

如果爲true,則在進程寫入其stdout文件描述符時將發出PROCESS_LOG_STDOUT事件。僅當接收到數據時文件描述符未處於捕獲模式時纔會發出事件(請參閱捕獲模式)。

默認值:0。
必填:否。
介紹:3.0a7

4.6.1.22stdout_syslog

如果爲true,則將stdout連同進程名稱一起定向到syslog。

默認值:False。
必填:否。
介紹:4.0.0

4.6.1.23stderr_logfile

除非redirect_stderr爲true,否則將進程stderr輸出放入此文件中。接受與stdout_logfile相同的值類型,並且可以包含相同的Python字符串表達式。

注意:
啓用輪換(stderr_logfile_maxbytes)時,兩個進程不可能共享一個日誌文件(stderr_logfile)。這將導致文件損壞。

注意:
如果將stderr_logfile設置爲不可查看的特殊文件(例如/dev/stderr),則必須通過設置stderr_logfile_maxbytes = 0來禁用日誌輪換。

默認值AUTO
必填:否。
介紹:3.0

4.6.1.24stderr_logfile_maxbytes

輪換stderr_logfile的日誌文件之前的最大字節數。接受與stdout_logfile_maxbytes相同的值類型。

默認值:50MB。
必填:否。
介紹:3.0

4.6.1.25stderr_logfile_backups

進程stderr日誌文件輪換產生要保留的備份數。如果設置爲0,將不保留任何備份。

默認值:10。
必填:否。
介紹:3.0

4.6.1.26stderr_capture_maxbytes

當進程處於“stderr捕獲模式”時,寫入捕獲FIFO的最大字節數(請參閱捕獲模式)。應爲整數(值中可以使用後綴乘數,例如“KB”,“MB”和“GB”)。如果該值爲0,則進程捕獲模式將關閉。

默認值:0。
必填:否。
介紹:3.0

4.6.1.27stderr_events_enabled

如果爲true,則在進程寫入其stderr文件描述符時將發出PROCESS_LOG_STDERR事件。僅當接收到數據時文件描述符未處於捕獲模式時纔會發出事件(請參閱捕獲模式)。

默認值:false。
必填:否。
介紹:3.0a7

4.6.1.28stderr_syslog

如果爲true,stderr將與進程名稱一起定向到syslog。

默認值:False。
必填:否。
介紹:4.0.0

4.6.1.29environment

格式爲KEY="val",KEY2="val2"的鍵/值對的列表,該鍵/值對將放置在子進程的環境中。環境字符串可能包含Python字符串表達式,將根據包含group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目錄)的字典對Python字符串表達式進行計算。包含非字母數字字符的值應加引號(例如KEY="val:123",KEY2="val,456")。否則,引號值是可選的,但建議使用。注意,子進程將繼承用於啓動“supervisord”的shell的環境變量,但此處重寫的變量除外。請參閱子進程環境

默認值:無額外環境。
必填:否。
介紹:3.0

4.6.1.30directory

代表目錄的文件路徑,supervisord在執行子級之前應暫時將目錄chdir。

默認值:不chdir(繼承supervisor的)。
必填:否。
介紹:3.0

4.6.1.31umask

代表該進程的umask的八進制數字(例如002、022)。

默認值:無特殊umask(繼承supervisor的)。
必填:否。
介紹:3.0

4.6.1.32serverurl

在環境中作爲SUPERVISOR_SERVER_URL(請參見supervisor.childutils)傳遞給子進程的進程的URL,以使子進程可以輕鬆地與內部HTTP服務通信。如果提供的話,它應該與具有相同名稱的[supervisorctl]部分選項具有相同的語法和結構。如果將其設置爲AUTO或未設置,則supervisor將自動構造服務URL,優先選擇在UNIX域套接字上監聽的服務,而不是在Internet套接字上監聽的服務。

默認值:AUTO。
必填:否。
介紹:3.0

4.6.2[program:x]示例

[program:cat]
command=/bin/cat
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=10
startretries=3
exitcodes=0
stopsignal=TERM
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

4.7[include]設置

supervisord.conf文件可能包含名爲[include]的部分。如果配置文件包含[include]部分,則它必須包含一個名爲“files”的鍵。此項中的值指定要包含在配置中的其它配置文件。

注意:
[include]部分僅由supervisord處理。它被supervisorctl忽略。

4.7.1[include]

4.7.1.1files

以空格分隔的文件glob序列。每個文件glob可以是絕對的也可以是相對的。如果文件glob是相對的,則認爲它是相對於包含它的配置文件的位置。“glob”是一種文件模式,它根據Unix shell使用的規則與指定的模式匹配。沒有波浪符號~擴展,但是*?和用[]表示的字符範圍將正確匹配。字符串表達式是根據包含host_node_name以及here(supervisord配置文件的目錄)的字典計算的。不支持來自包含文件中的遞歸包含。

默認值:無默認值(必填)。
必填:是。
介紹:3.0

已更改:3.3.0。添加了對host_node_name擴展的支持。

4.7.2[include]示例

[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf

4.8[group:x]設置

將“同類”進程組(也稱爲“程序”)分組爲“異類”進程組通常很有用,這樣就可以從Supervisor的各種控制器界面中將它們作爲一個單元進行控制。

要將程序放入一個組中以便可以將它們視爲一個單元,請在配置文件中定義一個[group:x]部分。組頭值是一個複合值。它是“group”一詞,緊接着是冒號,然後是組名。頭值[group:foo]描述了一個名稱爲“foo”的組。該名稱用於控制該配置所創建的進程的客戶端應用程序中。創建沒有名稱的組部分是錯誤的。名稱中不得包含冒號或括號字符。

[group:x],配置文件中的其它位置必須有一個或多個[group:x]部分,並且該組必須在programs值中按名稱引用它們。

如果通過[group:x]部分的programs行將“同類”過程組(由程序部分表示)放入“異類”組中,則該程序部分所隱含的同類組在運行時不會在supervisor中存在。相反,而是將屬於每個同類組的所有進程放入異類組。例如,給定以下組配置:

[group:foo]
programs=bar,baz
priority=999

鑑於以上所述,在supervisord啓動時,barbaz同類組將不存在,並且原本屬於它們的進程現在將移入foo組。

4.8.1[group:x]

4.8.1.1programs

程序名稱的逗號分隔列表。列出的程序成爲該組的成員。

默認值:無默認值(必填)。
必填:是。
介紹:3.0

4.8.1.2priority

類似於分配給該組的[program:x]優先級值的優先級數。

默認值:999。
必填:否。
介紹:3.0

4.8.2[group:x]示例

[group:foo]
programs=bar,baz
priority=999

4.9[fcgi-program:x]設置

Supervisor可以管理所有在同一套接字上監聽的FastCGI進程組。到目前爲止,FastCGI的部署靈活性有限。爲了獲得全面的進程管理,你可以在Apache下使用mod_fastcgi,但隨後便陷入了Apache低效的併發模型,即每個連接一個進程或線程。除了需要更多的CPU和內存資源外,每個連接模型的進程/線程可能會因資源緩慢而很快飽和,從而阻止了其它資源的使用。爲了利用更新的事件驅動的Web服務(例如lighttpd或nginx),它們不包含內置的進程管理器,你必須使用cgi-fcgi或spawn-fcgi之類的腳本。這些可以與進程管理器(例如supervisord或daemontools)結合使用,但需要每個FastCGI子進程綁定到其自己的套接字。這樣做的缺點是:不必要的複雜Web服務配置,不必要的重啓以及降低的容錯能力。如果FastCGI進程組可以共享套接字,那麼配置的套接字較少,Web服務配置就越小。共享套接字允許正常重啓,因爲在任何子進程正在重啓時,套接字仍受父進程綁定。最後,共享套接字具有更高的容錯能力,因爲如果給定進程失敗,則其它進程可以繼續爲入站連接提供服務。

藉助集成的FastCGI生成支持,Supervisor爲你提供了兩全其美的解決方案。你可以通過共享套接字的FastCGI進程組獲得全功能的進程管理,而不必綁定到特定的Web服務。這是一個明確的關注點分離,允許網絡服務和進程管理器各自盡其所能。

注意:
Supervisor中的套接字管理器最初是爲支持FastCGI進程而開發的,但不僅限於FastCGI。無需特殊配置,也可以使用其它協議。可以從文件描述符訪問打開的套接字的任何程序(例如,在Python中使用socket.fromfd)都可以使用套接字管理器。Supervisor將在組中派生的第一個子代之前自動創建套接字,綁定和監聽。套接字將通過文件描述符編號0(零)傳遞給每個子代。當組中的最後子代退出時,Supervisor將關閉套接字。

注意:
在Supervisor 3.4.0之前,不能在組([group:x])中引用FastCGI程序([fcgi-program:x])。

fcgi-program部分也遵守[program:x]部分的所有可用選項。

4.9.1[fcgi-program:x]

[fcgi-program:x]部分有一些[program:x]部分所沒有的鍵。

4.9.1.1socket

此程序的FastCGI套接字、TCP或UNIX域套接字。對於TCP套接字,請使用以下格式:tcp://localhost:9002。對於UNIX域套接字,請使用unix:///absolute/path/to/file.sock。字符串表達式根據包含鍵“program_name”和“here”(supervisord配置文件的目錄)的字典進行計算。

默認值:無默認值。
必填:是。
介紹:3.0

4.9.1.2socket_backlog

設置套接字監聽(2)積壓。

默認值:socket.SOMAXCONN。
必填:否。
介紹:3.4.0

4.9.1.3socket_owner

對於UNIX域套接字,此參數可用於指定FastCGI套接字的用戶和組。可以是UNIX用戶名(例如chrism)或以冒號分隔的UNIX用戶名和組(例如chrism:wheel)。

默認值:使用爲fcgi-program設置的用戶和組。
必填:否。
介紹:3.0

4.9.1.4socket_mode

對於UNIX域套接字,此參數可用於指定權限模式。

默認值:0700。
必填:否。
介紹:3.0

有關其它允許的鍵,請參考4.6[program:x]設置,增量上述約束和補充。

4.9.2[fcgi-program:x]示例

[fcgi-program:fcgiprogramname]
command=/usr/bin/example.fcgi
socket=unix:///var/run/supervisor/%(program_name)s.sock
socket_owner=chrism
socket_mode=0700
process_name=%(program_name)s_%(process_num)02d
numprocs=5
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0
stopsignal=QUIT
stopasgroup=false
killasgroup=false
stopwaitsecs=10
user=chrism
redirect_stderr=true
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

4.10[eventlistener:x]設置

Supervisor允許在配置文件中定義專門的同類進程組(“事件偵聽器池”)。這些池包含用於從supervisor的事件系統接收並響應事件通知的進程。有關事件如何工作以及如何實現可以聲明爲事件監聽器的程序的說明,請參見事件

注意,eventlistener部分會遵守[program:x]部分的所有可用選項,但stdout_capture_maxbytes除外。事件偵聽器不能在stdout上發出進程通信事件,但可以在stderr上發出(請參閱捕獲模式)。

4.10.1[eventlistener:x]

[eventlistener:x]部分中有一些[program:x]部分所沒有的鍵。

4.10.1.1buffer_size

事件監聽器池的事件隊列緩衝區大小。當監聽器池的事件緩衝區溢出時(例如,事件監聽器池無法跟上發送給它的所有事件的情況時,會發生這種情況),該緩衝區中最早的事件將被丟棄。

4.10.1.2events

以逗號分隔的事件類型名稱列表,此監聽器在接收通知時對此"感興趣",(有效事件類型名稱的列表,請參閱事件類型)。

4.10.1.3result_handler

一個pkg_resources入口點字符串,可解析爲可調用的Python。缺省值是supervisor.dispatchers:default_handler。指定備用結果處理程序是一件非常不常見的事情,因此,如何創建一個結果處理程序沒有文檔記錄。

有關其它允許的鍵,請參考4.6[program:x]設置,增量上述約束和補充。

4.10.2[eventlistener:x]示例

[eventlistener:theeventlistenername]
command=/bin/eventlistener
process_name=%(program_name)s_%(process_num)02d
numprocs=5
events=PROCESS_STATE
buffer_size=10
directory=/tmp
umask=022
priority=-1
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0
stopsignal=QUIT
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

4.11[rpcinterface:x]設置

在配置文件中添加rpcinterface:x設置僅對希望通過其它自定義行爲擴展supervisor的用戶有用。

在示例配置文件中,有一個名爲[rpcinterface:supervisor]的部分。默認情況下,如下所示。

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[rpcinterface:supervisor]部分必須保留在配置中,以使supervisor的標準設置正常運行。如果你不希望supervisor做任何開箱即用的事情,這就是你需要了解的有關此類型部分的全部信息。

但是,如果希望添加rpc接口命名空間以自定義supervisor,則可以添加附加的[rpcinterface:foo]部分,其中“foo”代表接口的命名空間(從Web根目錄開始),supervisor.rpcinterface_factory命名的是一個工廠可調用的值,它應具有一個函數簽名,該函數簽名接受一個單位置參數supervisord和執行配置所需的任意多個關鍵字參數。在[rpcinterface:x]部分中定義的所有額外鍵/值對將作爲關鍵字參數傳遞給工廠。

以下是在Python包my.package__init__.py文件中創建的工廠函數示例。

from my.package.rpcinterface import AnotherRPCInterface

def make_another_rpcinterface(supervisord, **config):
    retries = int(config.get('retries', 0))
    another_rpc_interface = AnotherRPCInterface(supervisord, retries)
    return another_rpc_interface

配置文件中的一部分用於配置它。

[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1

4.11.1[rpcinterface:x]

4.11.1.1supervisor.rpcinterface_factory

pkg_resources將“entry point”點名命名爲RPC接口的工廠函數。

默認值:N/A。
必填:否。
介紹:3.0

4.11.2[rpcinterface:x]示例

[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1

本文參考:
centos-systemd-etcs
centos7安裝yum安裝pip
systemd-Unit
Linux自動啓動supervisord
supervisord官網

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