国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

基于Python 的進程管理工具supervisor使用指南

2019-11-25 16:33:39
字體:
來源:轉載
供稿:網友

Supervisor 是基于 Python 的進程管理工具,只能運行在 Unix-Like 的系統上,也就是無法運行在 Windows 上。Supervisor 官方版目前只能運行在 Python 2.4 以上版本,但是還無法運行在 Python 3 上,不過已經有一個 Python 3 的移植版 supervisor-py3k

什么情況下我們需要進程管理呢?就是執行一些需要以守護進程方式執行的程序,比如一個后臺任務,我最常用的是用來啟動和管理基于 Tornado 寫的 Web 程序。

除此之外,Supervisor 還能很友好的管理程序在命令行上輸出的日志,可以將日志重定向到自定義的日志文件中,還能按文件大小對日志進行分割。

Supervisor 有兩個主要的組成部分:

  1. supervisord,運行 Supervisor 時會啟動一個進程 supervisord,它負責啟動所管理的進程,并將所管理的進程作為自己的子進程來啟動,而且可以在所管理的進程出現崩潰時自動重啟。
  2. supervisorctl,是命令行管理工具,可以用來執行 stop、start、restart 等命令,來對這些子進程進行管理。

安裝

sudo pip install supervisor

創建配置文件

echo_supervisord_conf > /etc/supervisord.conf

如果出現沒有權限的問題,可以使用這條命令

sudo su - root -c "echo_supervisord_conf > /etc/supervisord.conf"

配置文件說明

想要了解怎么配置需要管理的進程,只要打開 supervisord.conf 就可以了,里面有很詳細的注釋信息。

打開配置文件

vim /etc/supervisord.conf

默認的配置文件是下面這樣的,但是這里有個坑需要注意,supervisord.pid 以及 supervisor.sock 是放在 /tmp 目錄下,但是 /tmp 目錄是存放臨時文件,里面的文件是會被 Linux 系統刪除的,一旦這些文件丟失,就無法再通過 supervisorctl 來執行 restart 和 stop 命令了,將只會得到 unix:///tmp/supervisor.sock 不存在的錯誤 。

[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=chrism         ; (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=chris       ; should be same as http_username if set;password=123        ; should be same as http_password if set...

默認情況下,進程的日志文件達到50MB時,將進行分割,最多保留10個文件,當然這些配置也可以對每個進程單獨配置。

權限問題

設置好配置文件后,應先創建上述配置文件中新增的文件夾。如果指定了啟動用戶 user,這里以 oxygen 為例,那么應注意相關文件的權限問題,包括日志文件,否則會出現沒有權限的錯誤。例如設置了啟動用戶 oxygen,然后啟動 supervisord 出現錯誤

Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)

就是由于上面的配置文件中 /var/run 文件夾,沒有授予啟動 supervisord 的用戶 oxygen 的寫權限。/var/run 文件夾實際上是鏈接到 /run,因此我們修改 /run 的權限。

sudo chmod 777 /run

這樣有點簡單粗暴,也可以考慮把上述配置文件中 .sock,.pid 等文件修改到其他文件夾中,并確保有相應的權限即可。一般情況下,我們可以用 root 用戶啟動 supervisord 進程,然后在其所管理的進程中,再具體指定需要以那個用戶啟動這些進程。

使用瀏覽器來管理

supervisor 同時提供了通過瀏覽器來管理進程的方法,只需要注釋掉如下幾行就可以了。

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

在配置文件的最后,有一個 [include] 的配置項,跟 Nginx 一樣,可以 include 某個文件夾下的所有配置文件,這樣我們就可以為每個進程或相關的幾個進程的配置單獨寫成一個文件。

[include]files = /etc/supervisord.d/*.ini

進程的配置樣例

一個簡單的例子如下

; 設置進程的名稱,使用 supervisorctl 來管理進程時需要使用該進程名[program:your_program_name] command=python server.py --port=9000;numprocs=1         ; 默認為1;process_name=%(program_name)s  ; 默認為 %(program_name)s,即 [program:x] 中的 xdirectory=/home/python/tornado_server ; 執行 command 之前,先切換到工作目錄user=oxygen         ; 使用 oxygen 用戶來啟動該進程; 程序崩潰時自動重啟,重啟次數是有限制的,默認為3次autorestart=true      redirect_stderr=true    ; 重定向輸出的日志stdout_logfile = /var/log/supervisord/tornado_server.logloglevel=info

設置日志級別

loglevel 指定了日志的級別,用 Python 的 print 語句輸出的日志是不會被記錄到日志文件中的,需要搭配 Python 的 logging 模塊來輸出有指定級別的日志。

多個進程

按照官方文檔的定義,一個 [program:x] 實際上是表示一組相同特征或同類的進程組,也就是說一個 [program:x] 可以啟動多個進程。這組進程的成員是通過 numprocs 和 process_name 這兩個參數來確定的,這句話什么意思呢,我們來看這個例子。

; 設置進程的名稱,使用 supervisorctl 來管理進程時需要使用該進程名[program:foo] ; 可以在 command 這里用 python 表達式傳遞不同的參數給每個進程command=python server.py --port=90%(process_num)02ddirectory=/home/python/tornado_server ; 執行 command 之前,先切換到工作目錄; 若 numprocs 不為1,process_name 的表達式中一定要包含 process_num 來區分不同的進程numprocs=2          process_name=%(program_name)s_%(process_num)02d; user=oxygen         ; 使用 oxygen 用戶來啟動該進程autorestart=true      ; 程序崩潰時自動重啟redirect_stderr=true    ; 重定向輸出的日志stdout_logfile = /var/log/supervisord/tornado_server.logloglevel=info

上面這個例子會啟動兩個進程,process_name 分別為 foo:foo_01 和 foo:foo_02。通過這樣一種方式,就可以用一個 [program:x] 配置項,來啟動一組非常類似的進程。

再介紹兩個配置項 stopasgroup 和 killasgroup

; 默認為 false,如果設置為 true,當進程收到 stop 信號時,會自動將該信號發給該進程的子進程。如果這個配置項為 true,那么也隱含 killasgroup 為 true。例如在 Debug 模式使用 Flask 時,Flask 不會將接收到的 stop 信號也傳遞給它的子進程,因此就需要設置這個配置項。

stopasgroup=false       ; send stop signal to the UNIX process ; 默認為 false,如果設置為 true,當進程收到 kill 信號時,會自動將該信號發給該進程的子進程。如果這個程序使用了 python 的 multiprocessing 時,就能自動停止它的子線程。killasgroup=false       ; SIGKILL the UNIX process group (def false)

更詳細的配置例子,可以參考如下,官方文檔在這里

;[program:theprogramname];command=/bin/cat       ; the program (relative uses PATH, can take args);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);autorestart=unexpected    ; whether/when to restart (default: unexpected);startsecs=1          ; number of secs prog must stay running (def. 1);startretries=3        ; max # of serial start failures (default 3);exitcodes=0,2         ; 'expected' exit codes for process (default 0,2);stopsignal=QUIT        ; signal used to kill process (default TERM);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          ; setuid to this UNIX account to run the program;redirect_stderr=true     ; redirect proc stderr to stdout (default false);stdout_logfile=/a/path    ; stdout log path, NONE for none; default AUTO;stdout_logfile_maxbytes=1MB  ; max # logfile bytes b4 rotation (default 50MB);stdout_logfile_backups=10   ; # of stdout logfile backups (default 10);stdout_capture_maxbytes=1MB  ; number of bytes in 'capturemode' (default 0);stdout_events_enabled=false  ; emit events on stdout writes (default false);stderr_logfile=/a/path    ; stderr log path, NONE for none; default AUTO;stderr_logfile_maxbytes=1MB  ; max # logfile bytes b4 rotation (default 50MB);stderr_logfile_backups=10   ; # of stderr logfile backups (default 10);stderr_capture_maxbytes=1MB  ; number of bytes in 'capturemode' (default 0);stderr_events_enabled=false  ; emit events on stderr writes (default false);environment=A="1",B="2"    ; process environment additions (def no adds);serverurl=AUTO        ; override serverurl computation (childutils)

將多個進程按組管理

Supervisor 同時還提供了另外一種進程組的管理方式,通過這種方式,可以使用 supervisorctl 命令來管理一組進程。跟 [program:x] 的進程組不同的是,這里的進程是一個個的 [program:x] 。

[group:thegroupname]programs=progname1,progname2 ; each refers to 'x' in [program:x] definitionspriority=999         ; the relative start priority (default 999)

當添加了上述配置后,progname1 和 progname2 的進程名就會變成 thegroupname:progname1 和 thegroupname:progname2 以后就要用這個名字來管理進程了,而不是之前的 progname1。

以后執行 supervisorctl stop thegroupname: 就能同時結束 progname1 和 progname2,執行 supervisorctl stop thegroupname:progname1 就能結束 progname1。supervisorctl 的命令我們稍后介紹。

啟動 supervisord

執行 supervisord 命令,將會啟動 supervisord 進程,同時我們在配置文件中設置的進程也會相應啟動。

# 使用默認的配置文件 /etc/supervisord.confsupervisord# 明確指定配置文件supervisord -c /etc/supervisord.conf# 使用 user 用戶啟動 supervisordsupervisord -u user

更多參數請參考文檔

supervisorctl 命令介紹

# 停止某一個進程,program_name 為 [program:x] 里的 xsupervisorctl 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

注意:顯示用 stop 停止掉的進程,用 reload 或者 update 都不會自動重啟。也可以參考這里

開機自動啟動 Supervisord

Supervisord 默認情況下并沒有被安裝成服務,它本身也是一個進程。官方已經給出了腳本可以將 Supervisord 安裝成服務,可以參考這里查看各種操作系統的安裝腳本,但是我用官方這里給的 Ubuntu 腳本卻無法運行。

安裝方法可以參考 serverfault 上的回答。

比如我是 Ubuntu 系統,可以這么安裝,這里選擇了另外一個腳本

# 下載腳本sudo su - root -c "sudo curl https://gist.githubusercontent.com/howthebodyworks/176149/raw/d60b505a585dda836fadecca8f6b03884153196b/supervisord.sh > /etc/init.d/supervisord"# 設置該腳本為可以執行sudo chmod +x /etc/init.d/supervisord# 設置為開機自動運行sudo update-rc.d supervisord defaults# 試一下,是否工作正常service supervisord stopservice supervisord start

注意:這個腳本下載下來后,還需檢查一下與我們的配置是否相符合,比如默認的配置文件路徑,pid 文件路徑等,如果存在不同則需要進行一些修改。

其實還有一個簡單的方法,因為 Linux 在啟動的時候會執行 /etc/rc.local 里面的腳本,所以只要在這里添加執行命令就可以

# 如果是 Ubuntu 添加以下內容/usr/local/bin/supervisord -c /etc/supervisord.conf# 如果是 Centos 添加以下內容/usr/bin/supervisord -c /etc/supervisord.conf

以上內容需要添加在 exit 命令前,而且由于在執行 rc.local 腳本時,PATH 環境變量未全部初始化,因此命令需要使用絕對路徑。

在添加前,先在終端測試一下命令是否能正常執行,如果找不到 supervisord,可以用如下命令找到

sudo find / -name supervisord

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 巴中市| 葵青区| 如皋市| 咸宁市| 德安县| 团风县| 柯坪县| 三穗县| 寻甸| 西华县| 龙游县| 华阴市| 龙川县| 庄河市| 顺平县| 大兴区| 富蕴县| 治县。| 历史| 鄯善县| 秦皇岛市| 江门市| 遵化市| 吉首市| 延安市| 江安县| 安西县| 油尖旺区| 阜康市| 乌恰县| 界首市| 海伦市| SHOW| 临泽县| 马尔康县| 长葛市| 贵港市| 灵武市| 南涧| 宜君县| 皋兰县|