Python supervisor強(qiáng)大的進(jìn)程管理工具的使用
本文主要跟大家分享在類unix操作系統(tǒng)下supervisor的使用以及一些關(guān)于進(jìn)程的知識(shí)
一、問(wèn)題背景
1、背景
如何才能讓一個(gè)進(jìn)程擺脫終端,獲得相對(duì)較長(zhǎng)的生命周期?
2、后臺(tái)(守護(hù))、前臺(tái)進(jìn)程
什么是守護(hù)進(jìn)程?通俗點(diǎn)講就是后臺(tái)跑著的進(jìn)程,不會(huì)因?yàn)槟汴P(guān)了終端服務(wù)就會(huì)隨之停止,直到你把計(jì)算機(jī)的電源關(guān)閉。當(dāng)進(jìn)程變?yōu)楹笈_(tái)進(jìn)程后,同一個(gè)終端就會(huì)釋放了,你可以在其中干別的事情,而不會(huì)干擾到你跑的服務(wù)。后臺(tái)進(jìn)程一般來(lái)說(shuō)不能捕捉輸入,服務(wù)的輸出依然可以選擇在終端輸出。
同樣的道理,理解前臺(tái)進(jìn)程就簡(jiǎn)單多了,前臺(tái)進(jìn)程就是你的一個(gè)服務(wù)在跑,但是不能再在同一個(gè)終端干別的事情,必須把你現(xiàn)有的服務(wù)給停掉之后才可以繼續(xù)干別的事,前臺(tái)進(jìn)程可以捕捉輸入、輸出。
3、如何將前臺(tái)進(jìn)程啟動(dòng)為后臺(tái)進(jìn)程
用過(guò)Python Django進(jìn)行過(guò)開發(fā)的朋友一定會(huì)在自己本地的環(huán)境中跑過(guò)項(xiàng)目。如下圖,這樣跑起來(lái)的服務(wù),我們通常稱為前臺(tái)進(jìn)程,這個(gè)時(shí)候在此終端,你不能干別的事,當(dāng)然這么做一般都是用來(lái)看打印在終端的調(diào)試信息,但是在遠(yuǎn)程服務(wù)器上呢?情況就不一樣了吧。
下面是用Python bottle寫的一個(gè)最簡(jiǎn)單的web應(yīng)用(bottle-輕量級(jí)框架,感興趣的朋友可以去了解,pip install bottle可以安裝)
進(jìn)入終端
vim server.py
from bottle import route, run @route("/") def printStr(): return "hello world" run(host="localhost", port=8090, debug=True)
在終端下,把應(yīng)用跑起來(lái)
$ python server.py
出現(xiàn)上圖所示,訪問(wèn)http://localhost:8090/,瀏覽器就出現(xiàn)"hello world",這時(shí),ctrl+c后在訪問(wèn)就會(huì)報(bào)錯(cuò)了。下面演示如何將該進(jìn)程啟動(dòng)為后臺(tái)進(jìn)程
(1)依然可以在終端輸出的后臺(tái)進(jìn)程,就在命令行后加上&符號(hào),依然可訪問(wèn)
$ python server.py &
可以看到終端依然捕捉到輸出
(2) 使用nohup命令結(jié)合&符號(hào),該命令會(huì)在當(dāng)前目錄下生成nohup.out文件,此文件保存著本該終端打印出來(lái)的信息,如下圖所示
$ nohup python server.py &
4、如何辨別后臺(tái)進(jìn)程
上面亂搞一通就變成了后臺(tái)進(jìn)程?別急,我們通過(guò)ps命令看一下
$ ps aux
TT列為??的為后臺(tái)進(jìn)程,沒有得就是前臺(tái)進(jìn)程,前臺(tái)進(jìn)程還有個(gè)明顯的標(biāo)記就是有個(gè)''+"號(hào)
5、存在的問(wèn)題
上述啟動(dòng)為后臺(tái)進(jìn)程的方法,其實(shí)是存在很多問(wèn)題的。
(1)從項(xiàng)目的角度看,一個(gè)項(xiàng)目往往不止起一個(gè)進(jìn)程,還可能有其他的進(jìn)程,那么,如何進(jìn)行統(tǒng)一的進(jìn)程管理呢?
(2)在進(jìn)程運(yùn)行的過(guò)程中,因?yàn)槟撤N原因,掛掉了,如何做到不用人為干預(yù)自動(dòng)重啟進(jìn)程呢?
supervisor完美解決上面的兩個(gè)問(wèn)題,當(dāng)然可能還有更為強(qiáng)大的功能。
二、什么是supervisor
1、定義
Supervisor是用Python編寫的目前只能在類unix操作系統(tǒng)中使用的一個(gè)進(jìn)程管理工具。
注意,是一個(gè)管理工具,并不是庫(kù)或包。
2、作用
Supervisor進(jìn)程管理工具可以高效簡(jiǎn)單地對(duì)單個(gè)或者多個(gè)進(jìn)程進(jìn)行統(tǒng)一管理,如啟動(dòng)、重啟、停止進(jìn)程。更重要的作用是能在進(jìn)程因?yàn)槟撤N原因崩潰時(shí),做到自動(dòng)重啟
3、Supervisor的組成
Supervisor主要由以下兩部分組成:
(1)supervisord
:
當(dāng)我們啟動(dòng)Supervisor時(shí),首先會(huì)有一個(gè)supervisord進(jìn)程,稱為父進(jìn)程,它所管理的進(jìn)程是它的子進(jìn)程。supervisord進(jìn)程負(fù)責(zé)統(tǒng)一管理這些子進(jìn)程的啟動(dòng)、重啟、停止。某種角度上看,有點(diǎn)NGINX的master與worker的感覺吧。
(2)supervisorctl
:
一個(gè)命令行管理工具,輸入某些命令,如:start、stop、restart等,就可以對(duì)指定的進(jìn)程進(jìn)行相應(yīng)的操作了,極其簡(jiǎn)單。
如何簡(jiǎn)單地理解?
可以將supervisord理解為服務(wù)器,supervisorctl理解為客戶端,輸入的一些命令可以看做是客戶端與服務(wù)器的交互過(guò)程。更牛逼的是Supervisor提供了web api在瀏覽器上就可以直接進(jìn)行對(duì)進(jìn)程的可視化管理。
接下來(lái),在使用Supervisor進(jìn)程管理工具前,先來(lái)看看一些配置項(xiàng),當(dāng)然安裝好Supervisor之后,它的配置文件里已經(jīng)有很詳細(xì)的注釋了,這里主要介紹子進(jìn)程的配置文件的配置參數(shù)。下圖就是三個(gè)子進(jìn)程的配置文件,為什么要拿子進(jìn)程的配置出來(lái),形成一個(gè)獨(dú)立的配置文件呢?當(dāng)然是為了維護(hù)方便,就像很多人用NGINX一樣,把配置文件按模塊進(jìn)行管理
子進(jìn)程配置文件的示例
常用配置參數(shù)說(shuō)明:
配置項(xiàng) | 說(shuō)明 |
---|---|
directory | 就是你項(xiàng)目所在的位置,supervisord會(huì)自動(dòng)切換到這個(gè)目錄 |
command | 你跑項(xiàng)目的命令 |
user | 你用什么身份起進(jìn)程 |
autostart | 當(dāng)設(shè)置為true時(shí),當(dāng)supervisord啟動(dòng)時(shí),該子進(jìn)程就會(huì)自動(dòng)啟動(dòng) |
autorestart | 當(dāng)設(shè)置為true時(shí),子進(jìn)程因?yàn)槟撤N原因掛掉,會(huì)自動(dòng)進(jìn)行重啟 |
startsecs | 該子進(jìn)程啟動(dòng)多久后,才認(rèn)為進(jìn)程啟動(dòng)成功 |
startretries | 子進(jìn)程嘗試情動(dòng)的次數(shù),默認(rèn)為3 |
redirect_stderr | 當(dāng)設(shè)置為true時(shí),子進(jìn)程的標(biāo)準(zhǔn)錯(cuò)誤輸出重定向到supervisord后臺(tái)的標(biāo)準(zhǔn)輸出文件描述符 |
stdout_logfile | 子進(jìn)程標(biāo)準(zhǔn)輸出存放的路徑 |
stdout_logfile_maxbytes | 標(biāo)準(zhǔn)輸出文件達(dá)到多少后進(jìn)行輪轉(zhuǎn) |
stdout_logfile_backups | 標(biāo)準(zhǔn)輸出日志的備份數(shù)量 |
priority | 子進(jìn)程啟動(dòng)的優(yōu)先級(jí),值越小啟動(dòng)越早 |
接下來(lái),就是怎么用Supervisor的問(wèn)題了
三、如何使用supervisor
1、安裝Supervisor
兩種方式進(jìn)行安裝
$ brew install supervisor #(本人機(jī)子是MAC,其他類unix操作系統(tǒng)的發(fā)行版本,自行使用相應(yīng)的軟件管理命令)
$ pip install supervisor
注意:supervisor只運(yùn)行在python2.4以上的版本,但是不支持Python3.X,如果你的機(jī)子沒有相應(yīng)的版本就Google一下解決辦法吧
安裝完成之后,我的是默認(rèn)的安裝路徑
$ cd /usr/local/etc/
上圖所示的supervisord.ini文件就是安裝后產(chǎn)生的文件,supervisor.d是我自己自自建的文件夾,這個(gè)待會(huì)說(shuō)。
linux操作系統(tǒng)的是安裝路徑
我們先來(lái)看看supervisord.ini是什么?
2、編輯配置文件
$ cat -n supervisord.ini
可以看到大概有148行,有9個(gè)配置選項(xiàng)
上圖中畫紅色橫線的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目錄下,這個(gè)目錄是放臨時(shí)文件的,容易丟失,強(qiáng)烈建議改目錄放置,建議放在/var/run/下。
別看這supervisord.ini配置文件一大推東西,其實(shí)真正需要配的地方很少,本人就只是選用了第二個(gè)框的配置項(xiàng),這里還提一下【include】配置項(xiàng),跟NGNIX的配置文件如出一轍,意思是:我這里配置文件還包含了這個(gè)目錄下的所有配置文件。還記得上本提到的supervisor.d目錄嗎?里面可以放置很多**.ini文件,而這些.ini**的文件其實(shí)很簡(jiǎn)單,僅僅包含了上圖中的第六個(gè)配置項(xiàng),這樣就達(dá)到一個(gè)子進(jìn)程一個(gè)配置文件,方便進(jìn)行維護(hù)的目的。
$ ls supervisor.d/
$ vim server2.py
上圖的紅框的內(nèi)容,其實(shí)就是主配置文件中的第六個(gè)框的配置項(xiàng),只是把它抽出來(lái),形成獨(dú)立的配置文件,達(dá)到分而治之的目的。
以上就配置好了兩個(gè)子進(jìn)程,接下來(lái)就是跑起來(lái)了
3、啟動(dòng)supercisord
$ supervisord -c /usr/loacl/etc/supervisord.ini #注意:要以配置文件的方式開啟服務(wù)
上圖的現(xiàn)象是因?yàn)槲乙呀?jīng)啟動(dòng)了supervisord進(jìn)程,下面通過(guò)supervisorctl命令行工具進(jìn)行進(jìn)程管理
4、使用supervisorctl進(jìn)行進(jìn)程管理
進(jìn)入supervisorctl交互界面,也要以帶有配置文件的方式進(jìn)入,這樣才會(huì)跟蹤到配置
$ supervisorctl -c /usr/local/etc/supervisord.ini
上圖的現(xiàn)象是因?yàn)槲野汛a切換到了一個(gè)正在開發(fā)的分支上
supervisor> help #查看命令
于是乎,可以根據(jù)命令自由地對(duì)子進(jìn)程進(jìn)行管理。
下表是一些常用的命令:
常用的命令 | 說(shuō)明 |
---|---|
status | 查看當(dāng)前管理的子進(jìn)程 |
reload | 當(dāng)配置發(fā)生改變時(shí),進(jìn)行熱部署 |
restart [program_name] | 重啟某個(gè)子進(jìn)程 |
start [program_name] | 啟動(dòng)某個(gè)子進(jìn)程 |
5、可以通過(guò)web頁(yè)面進(jìn)行進(jìn)程可視化進(jìn)程管理
使用瀏覽器訪問(wèn)127.0.0.1:9001,進(jìn)入管理可視化界面
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python測(cè)試開發(fā)django之使用supervisord?后臺(tái)啟動(dòng)celery?服務(wù)(worker/beat)
- 在python3中使用Supervisor的詳細(xì)教程
- 使用 Supervisor 監(jiān)控 Python3 進(jìn)程方式
- python進(jìn)程管理工具supervisor的安裝與使用教程
- 基于Python 的進(jìn)程管理工具supervisor使用指南
- Python使用Supervisor來(lái)管理進(jìn)程的方法
- python進(jìn)程管理工具supervisor使用實(shí)例
- 使用Python的Supervisor進(jìn)行進(jìn)程監(jiān)控以及自動(dòng)啟動(dòng)
- python進(jìn)程管理工具supervisor安裝使用
相關(guān)文章
合并Excel工作薄中成績(jī)表的VBA代碼,非常適合教育一線的朋友
每次學(xué)生考試,評(píng)分完畢之后,把每個(gè)科的成績(jī)收集起來(lái),就得到了一個(gè)有若干工作表,每個(gè)表有學(xué)生學(xué)號(hào)、分?jǐn)?shù)等列的Excel工作薄。2009-04-04python GUI庫(kù)圖形界面開發(fā)之PyQt5樹形結(jié)構(gòu)控件QTreeWidget詳細(xì)使用方法與實(shí)例
這篇文章主要介紹了python GUI庫(kù)圖形界面開發(fā)PyQt5樹形結(jié)構(gòu)控件QTreeWidget詳細(xì)使用方法與實(shí)例,需要的朋友可以參考下2020-03-03如何利用python批量提取txt文本中所需文本并寫入excel
最近幫人寫了幾個(gè)小程序,所以記錄下,下面這篇文章主要給大家介紹了關(guān)于如何利用python批量提取txt文本中所需文本并寫入excel的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07python Qt5實(shí)現(xiàn)窗體跟蹤鼠標(biāo)移動(dòng)
今天小編就為大家分享一篇python Qt5實(shí)現(xiàn)窗體跟蹤鼠標(biāo)移動(dòng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Flask利用自定義接口實(shí)現(xiàn)mock應(yīng)用詳解
后端接口已提供,前端需要依賴后端接口返回的數(shù)據(jù)進(jìn)行前端頁(yè)面的開發(fā),如何配合前端?這篇就來(lái)介紹一下Flask如何利用自定義接口實(shí)現(xiàn)mock應(yīng)用,需要的可以參考一下2023-03-03