大雄z 发表于 2018-4-19 14:05

进程端口存在,但程序挂掉

本帖最后由 大雄z 于 2018-4-19 14:08 编辑

1、   脚本需求分析:
原因:程序有时会突然丢失,但进程存在,预警短信也不发送。
解决:日志文件每秒钟都会无时无刻的更新,此时在监控线上运行的程序日志文件,当日志文件30秒没有反应或者1分钟不增长,那就说明这个程序肯定有问题,那就需要运维人员干预查看了。

2、   计划任务:
# 每5分钟执行一次py脚本*/5 * * * * /usr/bin/python/opt/xx/service_check.py> /dev/null2>&1 &

3、   Py脚本
#!/usr/bin/env python# -*- coding:utf-8 -*-
import os
import time
import sys

# 获取当前路径,以及需要获取文件的日志文件路径.
List_dir = os.listdir(os.path.dirname(os.path.abspath(__file__)))
Log_dir = "release/linux/logs/wrapper.log"

"""
    更新某些不在上数或上数慢的服务
"""
def Upnotlstb():
    NLSTB = ("logpath")

    for i in NLSTB:
      with open(i, 'a') as NSLTBD:
            NSLTBD.write("python scripts project check, then not alone version insert update messages, \
            avoid send mail messages" + "\n")

"""
    获取文件路径的函数
    dirpath: 用于定义文件日志路径的相对路径
    :return: 返回文件元组,当前所有服务的日志相对路径
"""
def Dirfile():
    dirpath=[]
    for i in List_dir:
      if os.path.isdir(i):
            files=os.path.join(i,Log_dir)
            dirpath.append(files)
    return dirpath

"""
    获取文件大小
    dirsize: 定义一个键值对,用于更新文件的大小及路径
    Fsize: 查询到的每个文件大小
    :return 返回获取到的键值对
"""
def Filesize(dirname):
    dirsize = {}
    while True:
      for file in dirname:
            try:
                Fsize=os.path.getsize(file)
                dirsize=Fsize
            except Exception as E:
                pass
      return dirsize

"""
    收集两次文件的大小用于判断
    file_old_size:
   
"""
def Size_Judge(oldsize,newsize,dirname):e
    for dirfilename in dirname:
      # 循环获取每个文件的大小.
      file_old_size=oldsize
      file_new_size=newsize
      # 增长表示没问题,否则就是有问题
      if file_old_size != file_new_size:
            pass
      else:
            # 将获取的值写入文件中, 然后执行邮件脚本
            with open('test.txt','w') as file:
                file.write(dirfilename)
                file.write(",then logfile not increase" + "\n")
            os.system("/bin/bash /tmp/mail.sh")

"""
    执行上面定义的函数
    dirname 用于获取文件的路径相对地址,绝对地址需要手动定义
    old_dirsize 10秒钟前的文件大小,可以写成死循环
    new_dirsize 10秒钟后的文件大小
    Size_Judge 判断函数
"""
if __name__ == '__main__':
    # 获取文件路径
    dirname = Dirfile()

    # 先获取一个值,用于测试文件是否停止工作状态,10秒内大小一致说明文件已经挂了
    old_dirsize=Filesize(dirname)

    # 刷新缓冲区 10秒
    for sl in range(2):
      sys.stdout.flush()
      time.sleep(1)
    # 10秒钟之后在更新这些文件,不然获取的还是老的文件的大小
    # Upnotlstb()
    new_drssize=Filesize(dirname)


ps: 还可以在写一个python的smtp程序,小弟还不会,首先先用linux sendEmail代替。


4、   邮件shell脚本
#!/bin/bash
#
# Name:定义邮件发送脚本
# Version Number:1.1
# Language:bash shell
# Date:2017-05-12
# Author:xiong

# 此处定义用户邮箱名称如: name@xx.com
username=123@qq.com

# 此处定义用户邮箱密码
userpass=这里写密码

# 此处定义要发送哪个用户如 a.com发给b.com 这就定义b.com
senduser="这里定义发件人 比如a.qq.com b.qq.com c.qq.cm"

# 此处定义smtp地址如smtp.qiye.163.com:25必须加端口号
smtpaddess=smtp.qiye.163.com:25

# 此处定义邮件主题
subject="这里是标题"

# 此处定义邮件信息
message=’这里是内容’也可以打开文件比如 `cat /tmp/1.txt`

# 发送邮件到各个邮箱中去,附带一个附件显示每日pv
/usr/local/bin/sendEmail -f $username -t $senduser -s $smtpaddess -u $subject -o tls=auto -o message-content-type=html -o message-charset=utf8-xu $username -xp$userpass -m $message -a 这里可以带一个附件 >/dev/null


gteng1314 发表于 2018-4-19 14:20

不懂,学习了

wefbnkop 发表于 2018-4-19 14:56

好NB的感觉~

a44270110 发表于 2018-4-19 15:24

好NB的感觉~

小黑LLB 发表于 2019-2-1 17:30

思路可以,通过文件大小判断 顶一下 学习了 {:1_921:}
页: [1]
查看完整版本: 进程端口存在,但程序挂掉