0
点赞
收藏
分享

微信扫一扫

Python检测linux服务脚本

minute_5 2024-10-09 阅读 11

1、服务检查

#!/usr/bin/env python
# -*- coding:UTF-8 -*-
# description: auto check services status for running baibaoyun normally
# 当执行env python时,它其实会去env | grep PATH里(也就是 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)这几个路径里去依次查找名为python的可执行文件

import os

import sys
reload(sys)
sys.setdefaultencoding('utf-8')
sys.path.append(os.path.dirname(os.path.abspath(sys.argv[0])))

import time
from collections import OrderedDict
import senddingding


if len(sys.argv[1:]) < 1:
    print "参数传入错误."
    exit(4)

hostname = sys.argv[1]
role=None

try:
    role=sys.argv[2]
except Exception:
    pass


server_bin_mapping = OrderedDict()

if role == 'db':
    server_bin_mapping['MySQL'] = ['mysqld', '/etc/init.d/mysqld', '/etc/init.d/mysql']
elif role == 'web':
    server_bin_mapping['Redis'] = ['redis-server', '/etc/init.d/Redis']
    server_bin_mapping['Apache'] = ['httpd', '/etc/init.d/Apache', '/etc/init.d/httpd' ]
    server_bin_mapping['Nginx'] = ['nginx', '/etc/init.d/Nginx', '/etc/init.d/nginx' ]  
else:
    server_bin_mapping['MySQL'] = ['mysqld', '/etc/init.d/mysqld', '/etc/init.d/mysql']
    server_bin_mapping['Redis'] = ['redis-server', '/etc/init.d/Redis']
    server_bin_mapping['Apache'] = ['httpd', '/etc/init.d/Apache', '/etc/init.d/httpd' ]
    server_bin_mapping['Nginx'] = ['nginx', '/etc/init.d/Nginx', '/etc/init.d/nginx' ]


f = os.popen("ps -ef")
pslist = [ tuple(p.strip().split()) for p in f.readlines() ]
simple_ps = [ (p[1], ' '.join(p[7:])) for p in pslist]
f.close()

message = ["======== %s ======="%hostname, 'time: %s' %time.strftime('%Y-%m-%d %H:%M:%S')]

def start_server(server_name):
    shs = server_bin_mapping[server_name][1:]
    for sh in shs:
        if os.path.isfile(sh) and os.access(sh, os.X_OK) and os.system("%s start" %sh) == 0:
            message.append("%s服务尝试通过%s成功启动." %(server_name, sh))
            return True
        else:
            message.append("%s服务尝试通过%s启动失败." %(server_name, sh))
    message.append("%s服务不能启动.需要检查." %server_name)
    return False
                         

def stop_server(server_name):
    shs = server_bin_mapping[server_name][1:]
        for sh in shs: 
                if os.path.isfile(sh) and os.access(sh, os.X_OK) and os.system("%s stop" %sh) == 0:
                        message.append("%s服务通过%s停止成功." %(server_name, sh))
                        return True
                else:   
                        message.append("%s服务通过%s停止失败." %(server_name, sh))
        message.append("%s服务停止失败, 请检查." %server_name)
        return False


def check_alive(server_name):
    bin_name=server_bin_mapping[server_name][0]
    for item in simple_ps:
        if item[1].find(bin_name) != -1:
            #message.append("%s server is running." %server_name)
            return True
    message.append("%s服务没有运行." %server_name)
    return False
        
    
for server in server_bin_mapping:
    if not check_alive(server):
        start_server(server)
message.append("###########################")

if len(message) > 3:
    timestamp, sign = senddingding.get_sign_timestamp()
    senddingding.send_msg(senddingding.access_token, sign, timestamp, '\n'.join(message))

2、发送消息(senddingding.py)

#!/usr/binm/env python
#encoding:utf-8

import os
import sys
import time
import hmac
import hashlib
import base64
import urllib
import json

try:
    import requests
except ImportError as e:
    print(e)
    if os.system('pip install requests') == 0:
        import requests
    else:
        exit(1)


secret = ''

access_token = ''


def get_sign_timestamp():
    timestamp = int(round(time.time() * 1000))
    secret_enc = bytes(secret).encode('utf-8')
    string_to_sign = '%s\n%s'%(timestamp, secret)
    string_to_sign_enc = bytes(string_to_sign).encode('utf-8')
    hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
    sign = urllib.quote_plus(base64.b64encode(hmac_code))
    return timestamp, sign


def send_msg(access_token, sign, timestamp, msg):
    
    url = "https://oapi.dingtalk.com/robot/send?access_token=%s&sign=%s×tamp=%s" %(access_token, sign, timestamp)
    headers = {
        'Content-Type': 'application/json;charset=utf-8'
        }
    data = {
        'msgtype': 'text',
        'text': {
            'content': msg
            }
    }

    response = requests.post(url, data=json.dumps(data), headers=headers)
    if json.loads(response.text)['errmsg'] == 'ok':
        return True


if __name__ == '__main__':
    msg = sys.argv[1:]
    if not msg:
        print("错误: 消息为空")
        sys.exit(-1)
    timestamp, sign = get_sign_timestamp()
    send_msg(access_token, sign, timestamp, msg)

3、定时任务调用
#每周一到周五,九点到18点执行一次
00 9-18 * * 1-5 /scripts/checkserver.py 192.168.1.1 web &> /dev/null



举报

相关推荐

0 条评论