溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python supervisor強大的進程管理工具的使用

發(fā)布時間:2020-08-23 12:01:06 來源:腳本之家 閱讀:349 作者:陳家大耳 欄目:開發(fā)技術

本文主要跟大家分享在類unix操作系統(tǒng)下supervisor的使用以及一些關于進程的知識

一、問題背景

1、背景

如何才能讓一個進程擺脫終端,獲得相對較長的生命周期?

2、后臺(守護)、前臺進程

​什么是守護進程?通俗點講就是后臺跑著的進程,不會因為你關了終端服務就會隨之停止,直到你把計算機的電源關閉。當進程變?yōu)楹笈_進程后,同一個終端就會釋放了,你可以在其中干別的事情,而不會干擾到你跑的服務。后臺進程一般來說不能捕捉輸入,服務的輸出依然可以選擇在終端輸出。

同樣的道理,理解前臺進程就簡單多了,前臺進程就是你的一個服務在跑,但是不能再在同一個終端干別的事情,必須把你現(xiàn)有的服務給停掉之后才可以繼續(xù)干別的事,前臺進程可以捕捉輸入、輸出。

3、如何將前臺進程啟動為后臺進程

用過Python Django進行過開發(fā)的朋友一定會在自己本地的環(huán)境中跑過項目。如下圖,這樣跑起來的服務,我們通常稱為前臺進程,這個時候在此終端,你不能干別的事,當然這么做一般都是用來看打印在終端的調試信息,但是在遠程服務器上呢?情況就不一樣了吧。

Python supervisor強大的進程管理工具的使用

下面是用Python bottle寫的一個最簡單的web應用(bottle-輕量級框架,感興趣的朋友可以去了解,pip install bottle可以安裝)

進入終端

vim server.py

from bottle import route, run

@route("/")
def printStr():
  return "hello world"
  
run(host="localhost", port=8090, debug=True)

在終端下,把應用跑起來

$ python server.py

Python supervisor強大的進程管理工具的使用

出現(xiàn)上圖所示,訪問http://localhost:8090/,瀏覽器就出現(xiàn)"hello world",這時,ctrl+c后在訪問就會報錯了。下面演示如何將該進程啟動為后臺進程

(1)依然可以在終端輸出的后臺進程,就在命令行后加上&符號,依然可訪問

$ python server.py &

Python supervisor強大的進程管理工具的使用

Python supervisor強大的進程管理工具的使用

可以看到終端依然捕捉到輸出

Python supervisor強大的進程管理工具的使用​  

(2) 使用nohup命令結合&符號,該命令會在當前目錄下生成nohup.out文件,此文件保存著本該終端打印出來的信息,如下圖所示

$ nohup python server.py &

Python supervisor強大的進程管理工具的使用

4、如何辨別后臺進程

上面亂搞一通就變成了后臺進程?別急,我們通過ps命令看一下

$ ps aux

Python supervisor強大的進程管理工具的使用

TT列為??的為后臺進程,沒有得就是前臺進程,前臺進程還有個明顯的標記就是有個''+"號

5、存在的問題

上述啟動為后臺進程的方法,其實是存在很多問題的。

(1)從項目的角度看,一個項目往往不止起一個進程,還可能有其他的進程,那么,如何進行統(tǒng)一的進程管理呢?

(2)在進程運行的過程中,因為某種原因,掛掉了,如何做到不用人為干預自動重啟進程呢?

supervisor完美解決上面的兩個問題,當然可能還有更為強大的功能。

二、什么是supervisor

1、定義

Supervisor是用Python編寫的目前只能在類unix操作系統(tǒng)中使用的一個進程管理工具。

注意,是一個管理工具,并不是庫或包。

2、作用

Supervisor進程管理工具可以高效簡單地對單個或者多個進程進行統(tǒng)一管理,如啟動、重啟、停止進程。更重要的作用是能在進程因為某種原因崩潰時,做到自動重啟

3、Supervisor的組成

Supervisor主要由以下兩部分組成:

(1)supervisord:

當我們啟動Supervisor時,首先會有一個supervisord進程,稱為父進程,它所管理的進程是它的子進程。supervisord進程負責統(tǒng)一管理這些子進程的啟動、重啟、停止。某種角度上看,有點NGINX的master與worker的感覺吧。

(2)supervisorctl:

一個命令行管理工具,輸入某些命令,如:start、stop、restart等,就可以對指定的進程進行相應的操作了,極其簡單。

如何簡單地理解?

可以將supervisord理解為服務器,supervisorctl理解為客戶端,輸入的一些命令可以看做是客戶端與服務器的交互過程。更牛逼的是Supervisor提供了web api在瀏覽器上就可以直接進行對進程的可視化管理。

接下來,在使用Supervisor進程管理工具前,先來看看一些配置項,當然安裝好Supervisor之后,它的配置文件里已經有很詳細的注釋了,這里主要介紹子進程的配置文件的配置參數(shù)。下圖就是三個子進程的配置文件,為什么要拿子進程的配置出來,形成一個獨立的配置文件呢?當然是為了維護方便,就像很多人用NGINX一樣,把配置文件按模塊進行管理

Python supervisor強大的進程管理工具的使用

子進程配置文件的示例

Python supervisor強大的進程管理工具的使用​  

常用配置參數(shù)說明:

配置項 說明
directory 就是你項目所在的位置,supervisord會自動切換到這個目錄
command 你跑項目的命令
user 你用什么身份起進程
autostart 當設置為true時,當supervisord啟動時,該子進程就會自動啟動
autorestart 當設置為true時,子進程因為某種原因掛掉,會自動進行重啟
startsecs 該子進程啟動多久后,才認為進程啟動成功
startretries 子進程嘗試情動的次數(shù),默認為3
redirect_stderr 當設置為true時,子進程的標準錯誤輸出重定向到supervisord后臺的標準輸出文件描述符
stdout_logfile 子進程標準輸出存放的路徑
stdout_logfile_maxbytes 標準輸出文件達到多少后進行輪轉
stdout_logfile_backups 標準輸出日志的備份數(shù)量
priority 子進程啟動的優(yōu)先級,值越小啟動越早

接下來,就是怎么用Supervisor的問題了

三、如何使用supervisor

1、安裝Supervisor

兩種方式進行安裝

$ brew install supervisor #(本人機子是MAC,其他類unix操作系統(tǒng)的發(fā)行版本,自行使用相應的軟件管理命令)
$ pip install supervisor

注意:supervisor只運行在python2.4以上的版本,但是不支持Python3.X,如果你的機子沒有相應的版本就Google一下解決辦法吧

安裝完成之后,我的是默認的安裝路徑

$ cd /usr/local/etc/

Python supervisor強大的進程管理工具的使用
​ 

上圖所示的supervisord.ini文件就是安裝后產生的文件,supervisor.d是我自己自自建的文件夾,這個待會說。

linux操作系統(tǒng)的是安裝路徑

Python supervisor強大的進程管理工具的使用

我們先來看看supervisord.ini是什么?

2、編輯配置文件

$ cat -n supervisord.ini

可以看到大概有148行,有9個配置選項

Python supervisor強大的進程管理工具的使用

Python supervisor強大的進程管理工具的使用

Python supervisor強大的進程管理工具的使用

上圖中畫紅色橫線的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目錄下,這個目錄是放臨時文件的,容易丟失,強烈建議改目錄放置,建議放在/var/run/下。

別看這supervisord.ini配置文件一大推東西,其實真正需要配的地方很少,本人就只是選用了第二個框的配置項,這里還提一下【include】配置項,跟NGNIX的配置文件如出一轍,意思是:我這里配置文件還包含了這個目錄下的所有配置文件。還記得上本提到的supervisor.d目錄嗎?里面可以放置很多**.ini文件,而這些.ini**的文件其實很簡單,僅僅包含了上圖中的第六個配置項,這樣就達到一個子進程一個配置文件,方便進行維護的目的。

$ ls supervisor.d/

Python supervisor強大的進程管理工具的使用

$ vim server2.py

Python supervisor強大的進程管理工具的使用
​ 

上圖的紅框的內容,其實就是主配置文件中的第六個框的配置項,只是把它抽出來,形成獨立的配置文件,達到分而治之的目的。

以上就配置好了兩個子進程,接下來就是跑起來了

3、啟動supercisord

$ supervisord -c /usr/loacl/etc/supervisord.ini #注意:要以配置文件的方式開啟服務

Python supervisor強大的進程管理工具的使用

上圖的現(xiàn)象是因為我已經啟動了supervisord進程,下面通過supervisorctl命令行工具進行進程管理

4、使用supervisorctl進行進程管理

進入supervisorctl交互界面,也要以帶有配置文件的方式進入,這樣才會跟蹤到配置

$ supervisorctl -c /usr/local/etc/supervisord.ini 

Python supervisor強大的進程管理工具的使用​  

上圖的現(xiàn)象是因為我把代碼切換到了一個正在開發(fā)的分支上

supervisor> help #查看命令

Python supervisor強大的進程管理工具的使用

于是乎,可以根據(jù)命令自由地對子進程進行管理。

下表是一些常用的命令:

常用的命令 說明
status 查看當前管理的子進程
reload 當配置發(fā)生改變時,進行熱部署
restart [program_name] 重啟某個子進程
start [program_name] 啟動某個子進程

5、可以通過web頁面進行進程可視化進程管理

使用瀏覽器訪問127.0.0.1:9001,進入管理可視化界面

Python supervisor強大的進程管理工具的使用

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經查實,將立刻刪除涉嫌侵權內容。

AI