这篇博文比较简单,主要是运用了python的telnetlib模块监测本地指定端口的运行。如果检测到端口不可访问说明服务失效了。
只需要关闭假死的相关进程,重启服务即可。
本博文是基于某企业管理软件,其核心网站平台是基于tomcat6编写,由于其程序没有做到绝对优化,很多时候会出现假死的情况,加大内存和并发也是无济于事,那么只有做最坏的打算,Down掉后再马上重启服务,相关业余还是受到影响。
下面是pyhon实战代码:
# -- coding: UTF-8 --
import os
import re
import subprocess
import telnetlib
import time
import datetime
def port_validate(duankou):
nowtime = datetime.datetime.now()
# 转换为其他字符串格式:
strTime = nowtime.strftime("%Y-%m-%d %H:%M:%S")
setvalue = "我的验证时间 = '" + str(strTime) + "',"
st = time.time()
try:
telnetlib.Telnet("127.0.0.1", port=duankou, timeout=5)
except:
return False
else:
et = time.time()
costtime = "{:.2f}".format(float(et - st))
return True
def run_bats_restart():
cmd1 = 'taskkill /f /im tomcat6.exe'
cmd2 = 'net stop MSSQLSERVER /y'
cmd3 = 'net stop AAS'
cmd4 = 'net start MSSQLSERVER /y'
cmd5 = 'net start AAS'
run_cmd(cmd1)
run_cmd(cmd2)
run_cmd(cmd3)
time.sleep(5)
run_cmd(cmd4)
time.sleep(5)
run_cmd(cmd5)
return "OK"
def run_cmd(cmd):
popen = subprocess.Popen(cmd, stdout=subprocess.PIPE)
lines = popen.stdout.readlines()
if len(lines)!=0:
return ([line.decode('gbk') for line in lines])
else:
pass
if __name__ == '__main__':
port = "8891"
while True:
today = datetime.date.today()
weekday = today.isoweekday()
nowtime = time.strftime('%H%M', time.localtime(time.time()))
Day = float(time.strftime('%d', time.localtime(time.time())))
fnowtime = float(nowtime)
noticetimes = 1
if fnowtime >= 800 and fnowtime <= 2200 and Day >= 3 and Day <= 31:
# 每月1-2号为扎帐期,系统卡顿也不自动处理。手工根据情况进行调整。
status = port_validate(port)
if status == True:
print(str(nowtime) + ",8891正常,继续检测中")
else:
result = run_bats_restart()
print(str(nowtime) + ",8891关闭,已尝试重启服务" + str(result))
else:
pass
time.sleep(20)
continue
# 打包
# pyinstaller.exe -F C:\Users\Administrator\PycharmProjects\untitled3\AThack-mail\Check_port_restart.py
写的很乱,凑活着看吧。能用就行。。
上面是打包后在服务器运行的界面,故障测试过 可以进行重启服务。
有些网友在想为啥不用 cmd或者Power Shell来做,其实我也考虑过,cmd做起来有点麻烦,PS也是可以得,只是我没有精力去学校其语法,用PYthon凑活着干吧,至少别让我周末出去玩的时候,打电话来说XXX系统又坏了。。蛋疼。。