python脚本+任务计划-监测守护合同系统
1 背景
公司的合同系统在部署在阿里云的windows 2008操作系统上,一次性购买,没有升级和维保,使用了几年后,经常会出现系统无法使用的情况,故障现象为网站无法打开,使用人员会联系维护人员,维护人员登录系统后重启一下服务,恢复使用。系统的初衷是为人服务,这样一来,成了系统为使用人员服务,维护人员为系统服务。并且原维护人员,出于安全考虑,将合同系统服务器登录绑定到了企业IP地址。非工作时间维护给维护人员平添了很多麻烦。在一个偶然的机会下就接手了这个工作。两周的处理下来,觉得这个流程有改进的空间,于是工作之余开始着手改进。
2 原流程
说明:
- 业务人员访问合同系统
- 正常使用合同系统流程结束
- 异常使用告知维护人员
- 维护人员使用内网VPN登录云服务器
- 重启合同系统的服务
- 重启完毕验证,如果异常则再次重启,正常访问
- 反馈告知业务人员
- 业务人员确认正常使用系统流程结束
业务人员认为系统可用性太差,并且维护人员不给力
维护人员认为系统稳定性太差,出力不讨好,虽然对业务人员可以把问题甩锅给系统,但是毕竟是维护口在维护处理。
3 针对问题的想法
认清问题后,就要着手去处理问题。这个问题看起来不大,但是能按上面的处理方法处理了几年,原因无外乎就三种:
- 觉得这是个日常型问题,就该这么做
- 想处理但是不知道如何下手
- 给自己找点活干,工作汇报中有事可写。
要想处理问题就需要去分析一下这个问题,当业务人员反馈过来的时候,第一时间先自己登录一下系统,通过chrome的开发者模式查看,出现timeout和无法访问的情况。
问题定位了,处理就方便了,这个其实不算太大的问题,是系统中的监控部分,现有系统没有监控功能,所以每次都是“事后”(业务人员反馈过来)处理,反馈的时候,系统可能已经出问题很长一段时间了,
4 流程优化
说明:
- 使用程序每间隔5分钟访问合同系统
- 正常访问,不进行任何操作
- 异常访问,则调用脚本进行重启合同系统服务
- 异常重启后,写日志和发送邮件
5 实际操作
5.1 编制监测脚本
编制完毕测试没有问题后,使用工具将python脚本,打包成oam_contact.exe可执行文件。
#!/usr/bin/env python
# -*- coding=utf8 -*-
#
# Copyright : Copyright 2021 shalter Inc.
# File : oam_contract.py
# Introduce : 1、访问合同系统根据返回值和设置超时时间判断合同系统是否正常
# 2、如果不正常,重启合同脚本服务,写日志发送邮件通知维护人员
# 3、读取配置信息使用密文
# Version : V1.0.2
# Author : shalter
# Time : 2021-03-14
import requests
import os
import smtplib
import time
from email.mime.text import MIMEText
from email.utils import formataddr
def encrypt(key, s):
b = bytearray(str(s).encode("utf-8"))
n = len(b)
c = bytearray(n*2)
j = 0
for i in range(0, n):
b1 = b[i]
b2 = b1 ^ key
c1 = b2 % 19
c2 = b2 // 19
c1 = c1 + 46
c2 = c2 + 46
c[j] = c1
c[j+1] = c2
j = j+2
return c.decode("utf-8")
def decrypt(ksa, s):
c = bytearray(str(s).encode("utf-8"))
n = len(c)
if n % 2 != 0:
return ""
n = n // 2
b = bytearray(n)
j = 0
for i in range(0, n):
c1 = c[j]
c2 = c[j + 1]
j = j + 2
c1 = c1 - 46
c2 = c2 - 46
b2 = c2 * 19 + c1
b1 = b2 ^ ksa
b[i] = b1
return b.decode("utf-8")
def send_alert_mail():
my_sender = decrypt(23, 'w2fFW5627whpveuZJx3Z4AW') # 发件人邮箱账号
my_pass = decrypt(10, '1vC17YlWHM') # 发件人邮箱密码
my_user = decrypt(19, 'gEG4HkErRqTnFqfEbfI') # 收件人邮箱账号,邮箱组
def mail():
ret = True
try:
msg = MIMEText('合同系统异常进行了服务重启操作', 'plain', 'utf-8')
msg['From'] = formataddr(["运维组", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["维护人员", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = "合同系统告警邮件" # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qiye.163.com", 994) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception: # 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret = False
return ret
ret = mail()
if ret:
print("邮件发送成功")
else:
print("邮件发送失败")
def write_log():
error_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
with open('D:\\hhmonitor\\ht_log.txt', 'a', encoding='utf-8') as fp:
fp.write(error_time + " 合同系统进行了重启操作 \n")
def detect_os(deal_url):
res = requests.get(deal_url)
if res.status_code == 200 and int(res.elapsed.total_seconds()) < 6:
print('合同系统正常')
else:
print('合同系统异常')
os.system("D:\\hhmonitor\\restartht.bat")
send_alert_mail()
write_log()
def main():
deal_url = 'http://ht.xxxyyy.com/login.html'
detect_os(deal_url)
if __name__ == '__main__':
main()
5.2 编制启动脚本
启动脚本在检测脚本检测到合同异常的时候调用
D:\hhmonitor\restartht.bat
@echo off
net stop htserver
ping -n 5 127.0.0.1>nul
net start hhserver
5.3 创建定时任务
5.3.1 服务器管理器
开始—管理工具—服务器管理器
在打开的界面中选择 服务器管理器—配置—任务计划程序—任务计划程序库
5.3.2 定时任务计划
创建任务
在常规标签中 输入名词,填写描述
5.3.3 触发器
点击“新建”按钮,在新建触发器中的高级设置中勾选重复任务间隔
5.3.4 操作
操作选项卡中为设置需要执行的操作
点击操作选项卡—点击“新建”按钮。
新建操作中,操作—启动程序 设置中通过浏览选到打包完毕的合同检测程序。
5.4 验证
查阅邮件查看合同系统的重启次数和时间
以上为针对合同系统监测处理步骤,处理过后,很少收到业务部门的反馈,对业务使用人员来说,系统的可用性和稳定性有了很大的提高,见仁见智,系统还是那个系统,问题还在发生,只是在问题发生之初的5分钟之内通过程序进行了处理,提高了使用人员使用系统的无障碍体验。 方法可能不是最好,但是在一定程度上缓解了问题。