假如你打算在服務器上部署一段程序,同時希望能夠自動監測程序是否在持續正常運行,並且當服務宕機時能夠實現自動重啓服務,而不是24小時盯着服務器的反饋來手動來排查。
那麼應該怎麼辦呢??!!
方法當然有!Let’s go!
解決思路
本人在部署一個算法服務時,測試階段莫名其妙地出現了服務宕機的現象(鑑於反覆排查,始終未能確認服務宕機的根本原因),而只要重啓服務,一切又恢復了正常。爲了不耽誤正常業務的上線,只能退而求其次:就是用代碼自動監測服務的運行狀態。當發現服務宕機時,自動重啓服務。
思路當然很清晰,但是具體實現辦法呢?
‘Talk is cheap, show me the code!!!’
爲了解決這類問題,本人站在前人的肩膀上,總結了問題解決的核心三板斧:
第一斧:向主程序發送請求,判斷程序的狀態
def get_response():
res = None
try:
res = requests.post('訪問地址',json={"data":'''請求信息'''})
except:
pass
return res
需要運行一段程序,持續向主程序發送請求(本人主程序爲flask程序代碼,需要提交POST請求,根據是否正常反饋來判斷主程序是否宕機)
第二斧:當主程序宕機時,殺死進程
def kill():
# os.popen獲取主程序進程端口號信息
a = os.popen('netstat -aon|findstr "進程端口號"')
text = a.read()
id = text.split('\n')
for i in id:
if 'LISTENING' in i:
# 獲取端口號值
pid = i.split()[-1]
# 殺死主程序端口號的進程
a = os.popen('taskkill /f /pid %s' % (pid))
第三斧:殺死進程後,重啓主程序
# 爲了實現持續監測主程序的目的,需要執行死循環
while True:
try:
cmd = r'd:&&cd 主程序所在位置&&start /b python 主程序所在位置/主程序文件名'
a = os.popen(cmd)
print(a.read())
print('****************')
# 愛睡幾秒睡幾秒
time.sleep(2)
except Exception as e:
print(e)
核心三板斧下去,看哪個程序還敢隨隨便便宕機!!!
如果還有,你跟我說,就當我啥都沒說過~~~~~