supervisor 子进程退出_用supervisor监管你的程序,不用担心程序挂了
1.背景
無(wú)論多么優(yōu)秀的程序員都難以避免寫出來(lái)的程序會(huì)有崩潰的一天,特別是c、c++這種高技術(shù)含量的語(yǔ)言,一不小心就來(lái)個(gè)段錯(cuò)誤(segment fault),我們通常會(huì)寫一個(gè)守護(hù)進(jìn)程或者守護(hù)腳本,檢測(cè)對(duì)應(yīng)的進(jìn)程是否退出,如果發(fā)現(xiàn)目標(biāo)進(jìn)程退出了,就馬上在fork或者啟動(dòng)一個(gè)新的,這樣的檢測(cè)邏輯不復(fù)雜,簡(jiǎn)單幾行代碼即可,但是如果你要檢查的程序有很多個(gè),用不同的語(yǔ)言編寫等等,就比較繁瑣了。
2.supervisor安裝
今天給大家介紹的這個(gè)工具叫supervisor,看名字就知道是一個(gè)專門給管理員用的,這個(gè)工具非常強(qiáng)大,今天我們只做一個(gè)簡(jiǎn)單而實(shí)用的介紹,就是實(shí)現(xiàn)用supervisor監(jiān)管你的程序服務(wù),當(dāng)程序服務(wù)異常退出了,它幫你自動(dòng)再開啟一個(gè)新的。
#supervisor的安裝很簡(jiǎn)單,我們這里以Ubuntu16為例#apt一下即可,別忘了安裝之前要update一下apt install -y supervisor#一切順利之后,你會(huì)看到supervisor的服務(wù)和對(duì)應(yīng)配置文件信息service supervisor statusls /etc/supervisor/3.supervisor實(shí)戰(zhàn)
我們以一個(gè)python服務(wù)為例子,先看看這個(gè)例子的代碼如下
#!/usr/bin/env python# test.py# 如果還沒(méi)裝webpy的,先去webpy官網(wǎng)看安裝教程,比較簡(jiǎn)單# http://webpy.org/import weburls = ('/', 'index')class index:def GET(self):return "Hello, world!"if __name__ == "__main__":app = web.application(urls, globals())app.run()這是一個(gè)用python webpy框架做的一個(gè)簡(jiǎn)單的http服務(wù)程序,監(jiān)聽了8080端口提供http服務(wù),使用命令 python test.py 運(yùn)行即可。
下面我們開始配置supervisor,監(jiān)控上面我們做的這個(gè)簡(jiǎn)單的程序服務(wù) test.py。在supervisor的配置目錄 /etc/supervisor/conf.d 下面創(chuàng)建一個(gè) test_python.conf 的文件。/etc/supervisor/conf.d 這個(gè)目錄是supervisor用來(lái)給配置不同監(jiān)管用的配置文件夾,supervisor服務(wù)會(huì)包含這個(gè)目錄下面所有的conf配置文件,并識(shí)別里面的內(nèi)容對(duì)其進(jìn)程服務(wù)進(jìn)行監(jiān)管。下面我們看看我們這個(gè) test_python.conf配置內(nèi)容如下
#監(jiān)控服務(wù)名稱,這個(gè)自己起一個(gè)名字即可[program:test_python]#指定進(jìn)程的目錄,這里我們是在/tmp創(chuàng)建的,為了演示directory = /tmp#程序啟動(dòng)參數(shù),這個(gè)比較簡(jiǎn)單,用python運(yùn)行command = python test.py#是否跟隨supervisord的啟動(dòng)而啟動(dòng),我們?cè)O(shè)置了true是autostart=true#程序退出后自動(dòng)重啟,選擇true是autorestart=true#進(jìn)程被殺死時(shí),是否向這個(gè)進(jìn)程組發(fā)送stop信號(hào),包括子進(jìn)程,選擇true是stopasgroup=true#向進(jìn)程組發(fā)送kill信號(hào),包括子進(jìn)程,選擇true是killasgroup=true#下面這幾行是日志文件和日志大小和備份個(gè)數(shù)stdout_logfile=/var/log/test_python.logstdout_logfile_maxbytes = 50MBstdout_logfile_backups = 10配置內(nèi)容比較簡(jiǎn)單明了,配置完之后,我們重啟一下supervisor服務(wù),service supervisor restart,一切順利之后再用 service supervisor status看看服務(wù)運(yùn)行狀態(tài)。當(dāng)supervisor服務(wù)重啟后,它會(huì)發(fā)現(xiàn) test.py 進(jìn)程沒(méi)有起來(lái),然后就開啟了 test.py 進(jìn)程。
ps -ef|grep-v grep|grep test.pyroot 27314 27284 0 10:10 ? 00:00:00 python test.py#把進(jìn)程kill掉,模擬進(jìn)程崩潰退出kill -9 27314#再看看程序有沒(méi)有被重新開起來(lái)ps -ef|grep -v grep|grep test.pyroot 27483 27284 4 10:45 ? 00:00:00 python test.py#可以看到進(jìn)程號(hào)已經(jīng)變了是 27483,證明程序是新啟動(dòng)不是舊的睿江云官網(wǎng)鏈接:睿江云主機(jī)租用-云服務(wù)器-支持免費(fèi)測(cè)試-國(guó)內(nèi)專業(yè)的云主機(jī)提供商
總結(jié)
以上是生活随笔為你收集整理的supervisor 子进程退出_用supervisor监管你的程序,不用担心程序挂了的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解决神经网络过拟合问题—Dropout方
- 下一篇: zigbee上位机通过vs2019的mf