Python检测linux服务脚本
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
浙公网安备 33010602011771号