博客 / 詳情

返回

Linux Supervisor進程控制系統完全教程

一、簡介

Supervisor是一個進程控制系統,它使用户能夠監視和控制類unix操作系統進程。它通過提供基於配置或事件啓動、停止和重新啓動進程的機制,幫助管理應該在系統中連續運行的進程。對於需要控制和監視Linux或其他類unix操作系統上多個進程的狀態的開發人員和系統管理員來説,Supervisor特別有用。

監督程序通常作為後台守護進程運行,並充當負責管理多個進程的集中實體。它可用於管理各種類型的進程,例如web服務器、數據庫服務器、任務隊列和自定義應用程序。

在UNIX上,通常很難獲得進程的準確的上/下狀態。Pidfiles經常説謊。Supervisord將進程作為子進程啓動,因此它總是知道其子進程的真正up/down狀態,並且可以方便地查詢這些數據。

Supervisor特性:
  • 簡單:Supervisor是通過一個簡單的ini風格的配置文件來配置的,它很容易學習。它提供了許多每個進程的選項,如重新啓動失敗的進程和自動日誌輪換。
  • 集中管理:Supervisor提供了一個啓動、停止和監視進程的位置。進程可以單獨控制,也可以分組控制。也可以配置Supervisor提供本地或遠程命令行和web界面。
  • 高效:Supervisor通過fork/exec啓動它的子進程,子進程不被daemon化。當進程終止時,操作系統會立即向Supervisor發送信號,不像某些解決方案依賴麻煩的PID文件和定期輪詢來重新啓動失敗的進程。
  • 可擴展性:Supervisor有一個簡單的事件通知協議,用任何語言編寫的程序都可以用它來監視它,還有一個用於控制的XML-RPC接口。它還使用擴展點構建,Python開發人員可以利用這些擴展點。
  • 兼容性:除了Windows, Supervisor幾乎可以在所有設備上工作。它在Linux、Mac OS X、Solaris和FreeBSD上進行了測試和支持。它完全用Python編寫,因此安裝不需要C編譯器。
Supervisor的主要功能包括:
  • 進程控制:Supervisor可以啓動、停止和重新啓動進程。它確保指定的進程正在運行,如果它們意外崩潰或終止,它可以自動重新啓動它們。
  • 監視:Supervisor不斷地監視被管理流程的狀態。它可以跟蹤進程是否正在運行、是否已退出或是否遇到任何錯誤。這種監視功能允許Supervisor根據進程狀態採取適當的操作。
  • 日誌記錄和輸出捕獲:Supervisor捕獲子進程的標準輸出和標註錯誤流。這樣就可以存儲和分析日誌,幫助進行故障排除和調試。
  • 配置管理:Supervisor通常提供配置文件或配置管理系統來定義要管理的進程、啓動參數和其他相關設置。這允許從一箇中心位置輕鬆地管理和配置多個進程。
  • Web界面和命令行:Supervisor提供基於web的用户界面和命令行界面,用於管理和監控進程。
  • 分組:它允許對可以一起控制的進程進行分組,這在管理包含多個部分的微服務或應用程序時非常有用。
  • 事件通知:當被管理進程的狀態發生變化時,Supervisor可以發出事件,這些事件可用於與其他監視或警報系統集成。
Supervisor組件
  • supervisord:Supervisor的服務器部分被命名為supervisord。它負責在自己的調用時啓動子程序,響應來自客户端的命令,重新啓動崩潰或退出的子進程,記錄其子進程的標準輸出和標準錯誤輸出,以及生成和處理與子進程生命週期中的的“事件”。

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

  • supervisorctl:Supervisor的命令行客户端部分命名為supervisorctl。它為supervisord提供的特性提供了一個類似shell的接口。通過supervisorctl,用户可以連接到不同的supervisord進程(一次一個),獲取被控制的子進程的狀態,停止和啓動子進程,以及獲取正在運行的supervisord進程的列表。
  • Web Server:啓用internet socket,則可以通過瀏覽器訪問Web用户界面。啓用配置文件的[inet_http_server]部分後,訪問服務器URL(例如http://localhost:9001/),通過web界面查看和控制進程狀態。
  • XML-RPC Interface:提供web UI的同一個HTTP服務器同時提供了一個XML-RPC接口,該接口可用於查詢和控制管理程序及其運行的程序。

二、安裝方法

  • 通過pip安裝
pip install supervisor
  • Linux Debian系
sudo apt-get install supervisor
  • Linux CentoOS系
sudo yum install -y supervisor
  • MacOS
brew install supervisor
  • Windows不支持

Supervisor的發佈包的一個特點是,它們通常已經集成到發佈的服務管理基礎設施中,例如,允許在系統啓動時自動啓動Supervisor,一般都自動配置到了systemd服務中。

如果沒有自動創建配置文件,則使用如下命令創建:

echo_supervisord_conf > /etc/supervisord.conf

echo_supervisord_conf 會打印supervisord的配置信息,然後寫到/etc/supervisord.conf中

三、運行supervisord

supervisord

supervisord默認會作為守護進程來運行,運行的日誌可以在supervisor.log中查看,也可以通過 -n 選項來指定supervisord在前台運行,一般用於查看debug信息。

supervisord的常用的命令行選項有:
  • -c [FILE], --configuration=[FILE]:指supervisord使用的配置文件。
  • -n, --nodaemon:在前台運行。
  • -s, --silent:靜音模式,沒有輸出定向到標準輸出。
  • -h, --help:打印幫助信息。
  • -d [PATH], --directory=[PATH]:當supervisord作為守護進程運行時,在守護進程之前切換到該目錄。
  • -l FILE, --logfile=FILE:指定supervisord的日誌文件路徑。
  • -y BYTES, --logfile_maxbytes=BYTES:輪換髮生前 Supervisord 活動日誌文件的最大大小。該值是後綴相乘的,例如“1”是一個字節,“1MB”是 1 MB,“1GB”是 1 GB。
  • -z NUM, --logfile_backups=NUM:要保留的 Supervisord 活動日誌的備份副本數量。每個日誌文件的大小為 logfile_maxbytes。
  • -e LEVEL, --loglevel=LEVEL:日誌記錄級別,分別有:trace, debug, info, warn, error, critical。
  • -j FILE, --pidfile=FILE:Supervisord 應將其 pid 文件寫入的文件名。
  • -i STRING, --identifier=STRING:此Supervisor實例的各種客户端 UI 公開的任意字符串標識符。
  • -a NUM, --minfds=NUM:在成功啓動之前,supervisord 進程必須可用的文件描述符的最小數量。
  • -v, --version:打印版本號
  • --minprocs=NUM:在成功啓動之前,supervisord 進程必須可用的操作系統進程槽的最小數量。

四、Supervisorctl

常用的命令行選項
  • -c, --configuration:指定supervisord.conf配置文件路徑
  • -h, --help:打印幫助信息
  • -i, --interactive:進行交互式shell
  • -s, --serverurl URL:Supervisord 服務器正在偵聽的 URL(默認“http://localhost:9001”)。
  • -u, --username:用於向服務器進行身份驗證的用户名:用於向服務器進行身份驗證的用户名。
  • -p, --password:用於與服務器進行身份驗證的密碼。
常用的操作
  • help:打印可用的操作列表
  • help [action]:打印指定操作的用法
  • update:重新加載所有配置並根據需要添加/刪除,並重新啓動受影響的程序。
  • update [group]:重新加載指定組名的進程,並重新啓動受影響的程序。
  • clear [name]:清理進程日誌文件。
  • clear [name] [name]:清理多個進程日誌文件,用空格隔開。
  • clear all:清理所有進程日誌文件。
  • pid:獲取supervisord的PID,也可以使用 ps -ef | grep supervisord 獲取。
  • pid [name]:獲取指定子進程的PID。
  • pid all:獲取所有子進程的PID。
  • reread:重新加載配置文件,不會重新啓動,也就是改動的還不會生效。
  • restart [name]:指定進程重新啓動,注意:重新啓動不會重新讀取配置文件。
  • restart [gname]:*:重新啓動進程組中的所有進程,不會重新讀取配置文件。
  • restart [name] [name]:一次重新啓動多個進程,用空格分隔,不會重新讀取配置文件。
  • restart all:重新啓動所有進程,不會重新讀取配置文件。
  • 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):查看指定進程的日誌,在supervisorctl內部調用tail -f。

一般情況下,添加或修改了配置文件,使用兩個命令即可:supervisorctl reread、supervisorctl update。

Supervisord自動啓動腳本:

五、配置文件説明

Supervisor默認的配置文件名為:supervisord.conf,裏面包含supervisord和supervisorctl的配置,可以通過在supervisord或supervisorctl後面接 -c 選項指定配置文件。

supervisor搜索配置文件的默認順序如下:

$CWD表示當前目錄

  • ../etc/supervisord.conf
  • ../supervisord.conf
  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf
  • /etc/supervisor/supervisord.conf

[unix_http_server]部分配置

其中應該插入偵聽UNIX域套接字的HTTP服務器的配置參數。如果配置文件中沒有[unix_http_server]部分,則不會啓動UNIX域套接字HTTP服務器。

配置項有:

  • file:socket文件路徑,supervisor將在該套接字上監聽HTTP/XML-RPC請求。supervisorctl使用XML-RPC通過該端口與supervisord通信。一般位於:/tmp/supervisor.sock。
  • chmod:socket文件權限,默認值是:0700。
  • chown:socket文件所有者,格式為:uid:gid。
  • username:對此HTTP服務器進行身份驗證所需的用户名,默認為空。
  • password:對此HTTP服務器進行身份驗證所需的密碼,默認為空,可以是一個明文密碼,也可以指定為SHA-1哈希,如果前綴是字符串{SHA}。例如,{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d是密碼thepassword的SHA存儲版本,默認為空。

配置項示例:

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

[inet_http_server]部分配置

啓用此配置,則可用通過Web UI 來訪問Supervisor後台,簡易的Web頁面上可以做常用的supervisorctl的操作。

配置項有:

  • port:指定訪問的IP地址和端口,,格式如下:
port=127.0.0.1:9001

或

port=*:9001
  • username:UI界面登錄的用户名,默認為空
  • password:UI界面登錄的密碼,默認為空,同上也可以是哈希密碼。

配置項示例:

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

[supervisord]部分配置

  • logfile:Supervisord 進程的活動日誌的路徑,默認值:$CWD/supervisord.log。
  • logfile_maxbytes:活動日誌文件在輪換之前可能消耗的最大字節數,(可以在值中使用“KB”、“MB”和“GB”等後綴乘數)。將此值設置為 0 以指示日誌大小不受限制,默認值是:50M。
  • logfile_backups:由活動日誌文件輪換產生的要保留的備份數量。如果設置為 0,則不會保留任何備份,默認值是:10。
  • loglevel:日誌級別,可用的值有:critical, error, warn, info, debug, trace, blather,默認值是:info。
  • pidfile:Supervisord的PID文件路徑,默認值是:$CWD/supervisord.pid。
  • umask:Supervisord 進程的掩碼,默認值是:022。
  • nodaemon:如果為 true,Supervisord 將在前台啓動而不是守護進程,默認值是:false。
  • silent:如果為 true 並且未守護進程,日誌將不會定向到 stdout,默認值是:false。
  • minfds:在Supervisord成功啓動之前必須可用的文件描述符的最小數量,默認值是:1024。
  • minprocs:在Supervisord成功啓動之前必須可用的進程描述符的最小數量,默認值是:200。
  • user:指示Supervisord在進行任何有意義的處理之前將用户切換到此UNIX 用户帳户。僅當Supervisord以root用户身份啓動時才能切換用户。
  • directory:當Supervisord守護進程時,切換到該目錄。
  • strip_ansi:從子日誌文件中刪除所有 ANSI 轉義序列,默認值是:false。
  • environment:鍵/值對的列表,格式為key="val",KEY2="val2",將放置在所有子進程的環境中。這並沒有改變Supervisord本身的環境。包含非字母數字字符的值應該加引號(例如KEY="val:123",KEY2="val,456")。否則,引號是可選的,但建議使用。要轉義百分比字符,只需要再加一個百分號。(例如URI="/first%%20name")請注意,子進程將繼承用於啓動Supervisord的shell的環境變量,默認為空。
  • identifier:該Supervisor進程的標識符字符串,由 RPC 接口使用,默認值是:supervisor。

配置項示例:

[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"

[supervisorctl]部分配置

  • serverurl:用於訪問 Supervisord 服務器的 URL,例如http://localhost:9001。對於 UNIX socket,使用 unix:///absolute/path/to/supervisor.sock。
  • username:傳遞到 Supervisord 服務器以用於身份驗證的用户名,默認值是:空。
  • password:傳遞到 Supervisord 服務器以用於身份驗證的密碼,默認值是:空。
  • prompt:用作supervisorctl提示符的字符串,默認值是:supervisor。

配置項示例:

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

[program:x]部分配置

配置文件必須包含一個或多個程序段,以便Supervisord知道它應該啓動和控制哪些程序。報頭值是複合值。它是單詞“program”,後面直接跟一個冒號,然後是程序名。例如:頭文件的值[program:foo]描述了一個名為“foo”的程序。該名稱用於控制因此配置而創建的進程的客户端應用程序。創建沒有名稱的程序節是錯誤的。名稱不能包含冒號字符或括號字符。名稱值的字符串表達式是:%(program_name)s,可用於其他地方當做變量使用。

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

但是,例如,如果有一個[program:foo]節,其numprocs為3,process_name表達式為%(program_name)s_%(process_num)02d,那麼“foo”組將包含三個進程,分別命名為foo_00、foo_01和foo_02。這使得使用單個[program:x]段啓動多個非常相似的進程成為可能。所有日誌文件名、所有環境字符串和程序命令也可以包含類似的Python字符串表達式,以便向每個進程傳遞略有不同的參數。簡單來説:如果只有一個進程則組名等於程序名,有多個進程,則組名後加上編號作為程序名。

  • command

啓動該程序時將運行的命令。該命令可以是絕對路徑(例如/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_name、host_node_name、program_name、process_num、numprocs的字典求值。

如果該命令看起來像配置文件註釋,則會被截斷,例如command=bash -c 'foo;Bar '將被截斷為command=bash -c 'foo。引號不會阻止這種行為,因為配置文件讀取器不會像shell那樣解析命令,所以不要加上分號。

  • process_name:一個Python字符串表達式,用於組成此進程的Supervisor進程名。除非更改numprocs,否則通常不需要擔心設置這個,默認值是:%(program_name)s,取的是program的名字。
  • numprocs:Supervisor 將啓動由 numprocs 指定的多個該程序的實例。注意,如果 numprocs > 1,則 process_name 表達式中必須包含 %(process_num)s (或任何其他包含 process_num 的有效 Python 字符串表達式),默認值是:1。
  • numprocs_start:一個整數偏移量,用於計算 process_num 開始的編號,默認值是:0,例如改為1,則process_name顯示如:foo_01、foo_02,那麼就是從1開始編號。
  • directory:程序在執行之前切換到的目錄。
  • priority:程序在啓動和關閉順序中的相對優先級。較低的優先級表示程序首先啓動並在啓動時最後關閉,當在各種客户端中使用聚合命令時(例如“start all”/“stop all”)。較高的優先級表示最後啓動並首先關閉的程序,默認值是:999。
  • autostart:如果為true,則該程序將在supervisord啓動時自動啓動,默認值是:true。
  • startsecs:啓動後程序需要保持運行的總秒數,以認為啓動成功(將進程從STARTING狀態移動到RUNNING狀態)。設置為0表示程序不需要在任何特定的時間內保持運行,默認值是:1。
  • startretries:嘗試啓動的次數,超過此次數還是啓動失敗則把進程置為FATAL狀態,默認值是:3。
  • autorestart:指定程序在RUNNING狀態下退出後是否自動重啓。

可選的值有:false(表示不會自動重啓),unexpected(意外退出的情況,必須是退出碼不在exitcodes中列出的退出碼才能觸發),true(表示無條件重啓,不考慮退出碼)

默認值是:unexpected。

  • exitcodes:與autorestart一起使用,預期的退出碼列表,默認值是:0,多個退出碼用逗號隔開,如:0,2。
  • stopsignal:殺死進程的信號名稱,可選的值有:TERM, HUP, INT, QUIT, KILL, USR1, USR2;默認值是:TERM。
  • stopwaitsecs:在程序被髮送停止信號後等待操作系統返回SIGCHLD到supervisord的秒數。如果在supervisord收到進程的SIGCHLD之前超過了這個秒數,那麼supervisord將嘗試使用最後的SIGKILL殺死進程,默認值是:10。
  • stopasgroup:如果為true,則該標誌會導致Supervisor向整個進程組發送停止信號,並隱式設置killasgroup為true,默認值是:false。
  • killasgroup:如果為true,則當向程序發送SIGKILL 來終止它時,將其發送到整個進程組,默認值是:false。
  • user:指示supervisord 使用此用户帳户作為運行程序的帳户。僅當supervisord以root用户身份運行時才能切換用户。如果supervisord無法切換到指定用户,程序將不會啓動。
  • redirect_stderr:如果為true,進程的標準錯誤重定向到標準輸出,默認值是:false,相當於:2>&1。
  • stdout_logfile:將進程的標準輸出記錄在這個文件中(如果redirect_stderr為true,也將標準輸出記錄在這個文件中)。如果stdout_logfile未設置或設置為AUTO,則管理程序將自動選擇文件位置。如果設置為NONE, supervisord將不創建日誌文件。AUTO日誌文件及其備份將在重啓時被刪除,默認值是:AUTO。

啓用輪換 (​​stdout_logfile_maxbytes) 時,兩個進程不能共享單個日誌文件 (stdout_logfile)。這將導致文件被損壞,多個進程不能同時寫同一個文件。

如果stdout_logfile設置為特殊文件,如/dev/stdout,則必須通過設置stdout_logfile_maxbytes = 0來禁用日誌輪轉。

  • stdout_logfile_maxbytes:stdout_logfile 在旋轉之前可以消耗的最大字節數(可以在值中使用“KB”、“MB”和“GB”等後綴乘數)。將此值設置為 0 以指示日誌大小不受限制,默認值是:50M。
  • stdout_logfile_backups:標準輸出日誌文件保留的備份數量。如果設置為0,則不會保留任何備份,默認值是:10。
  • stdout_capture_maxbytes:當進程處於“標準輸出捕獲模式” 時,寫入捕獲 FIFO 的最大字節數。應為整數(值中可以使用“KB”、“MB”和“GB”等後綴乘數)。如果該值為 0,則進程捕獲模式將關閉,默認值是:0。
  • stdout_syslog:如果為true,標準輸出將帶上進程名稱標識發送到syslog,默認值是:false。
  • stderr_logfile:標準錯誤寫入的日誌文件路徑,默認值是:AUTO。

啓用輪換 (​​stderr_logfile_maxbytes) 時,兩個進程不能共享單個日誌文件 (stderr_logfile)。這將導致文件被損壞,多個進程不能同時寫同一個文件。

如果stderr_logfile設置為不可查找的特殊文件(例如 /dev/stderr),則必須通過設置 stderr_logfile_maxbytes = 0 來禁用日誌輪轉。

  • stderr_logfile_maxbytes:stderr_logfile的日誌文件輪換之前的最大字節數。接受與 stdout_logfile_maxbytes 相同的值類型,默認值是:50M。
  • stderr_logfile_backups:標準錯誤日誌文件保留的備份數量。如果設置為0,則不會保留任何備份,默認值是:10。
  • stderr_capture_maxbytes:當進程處於“標準錯誤捕獲模式” 時,寫入捕獲 FIFO 的最大字節數。應為整數(值中可以使用“KB”、“MB”和“GB”等後綴乘數)。如果該值為 0,則進程捕獲模式將關閉,默認值是:0。
  • stderr_syslog:如果為true,標準錯誤將帶上進程名稱標識發送到syslog,默認值是:false。
  • environment:環境變量,鍵/值對的列表,格式為key ="val",KEY2="val2",將放置在子進程的環境中。

配置項示例:

[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

[include]部分配置

即在主配置文件中加載目錄下的子配置文件

  • files:可以為絕對路徑,也可以為相對路徑,可以指定多個路徑,用空格隔開。

配置項示例:

[include]
files = /opt/homebrew/etc/supervisor.d/*.ini ../etc/supervisor.d/*.ini

[group:x]部分配置

進程組的定義

要將程序放入一個組中,以便可以將它們視為一個單元,在配置文件中定義一個[group:x]節。組頭值是一個複合值。它是單詞“group”,後面直接跟一個冒號,然後是組名。頭值[group:foo]描述了一個名為“foo”的組。該名稱用於控制因此配置而創建的進程的客户端應用程序。創建沒有名稱的組節是錯誤的。名稱不能包含冒號字符或括號字符。

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

  • programs:以逗號分隔的程序名稱列表。列出的程序成為該組的成員,例如:programs=program1,program2。
  • priority:進程組的優先級,默認值是:999。

配置項示例:

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

六、子進程

Supervisor的主要目的是基於其配置文件中的數據創建和管理進程。它通過創建子流程來實現這一點。由Supervisor生成的每個子進程在其整個生命週期內都由supervisord管理(supervisord是它創建的每個進程的父進程)。當子進程死亡時,通過SIGCHLD信號通知Supervisor,並執行相應的操作。

子進程狀態:
  • STOPPED:進程已經停止或從未啓動。
  • STARTING:進程正在啓動中。
  • RUNNING:進程正在運行中。
  • BACKOFF:該進程進入STARTING 狀態,但隨後退出得太快(在 startsecs 中定義的時間之前),無法進入 RUNNING 狀態。
  • STOPPING:進程正在停止中。
  • EXITED:進程從RUNNING狀態退出,
  • FATAL:進程無法啓動成功。
  • UNKNOWN:未知的進程狀態,一般情況是supervisord自身的程序錯誤。

當自動重啓進程處於BACKOFF狀態時,該進程將被supervisord自動重啓。它將在STARTING和BACKOFF狀態之間切換,直到它明顯無法啓動,因為啓動次數已經超過了最大值,此時它將轉換到FATAL狀態。

根據後續嘗試的次數,重試所花費的時間會越來越長,每次增加一秒鐘。

如果自動重啓的進程最終處於FATAL狀態,它將永遠不會自動重啓(必須手動從此狀態重啓)。

日誌

活動日誌由supervisord根據配置文件[supervisord]部分中的logfile_maxbytes和logfile_backups參數組合“旋轉”。當活動日誌達到logfile_maxbytes字節時,將當前日誌文件移動到備份文件中,並創建一個新的活動日誌文件。發生這種情況時,如果現有備份文件的數量大於或等於logfile_backups,則刪除最舊的備份文件,並相應地重命名備份文件。如果要寫入的文件名為“supervisord.log”,則當其超過logfile_maxbytes時,將關閉該文件並將其重命名為supervisord.log.1,如果supervisor.log.1, supervisord.log都存在,則將其重命名為supervisord.log.2, supervisord.log.3 等等。如果logfile_maxbytes為0,則不會輪換日誌文件(因此不會進行備份)。如果logfile_backups為0,則不保留任何備份。

注意事項:路徑不支持~,即家目錄要寫全稱。

官方文檔

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.