#!/usr/bin/env python
# -*- coding:utf8 -*-
# Description: 自动拉起服务,python2/python3
# usage: 部署定时任务: */4 * * * * python xxx.py
import os
import socket
import datetime
import subprocess
class SingleNodeDeploy(object):
@staticmethod
def system_command(command):
shell = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
stdout, stderr = shell.communicate()
try:
return stdout.decode("utf8"), stderr.decode("utf8"), shell.returncode
except Exception as error:
return stdout.decode("gbk"), error, shell.returncode
@staticmethod
def ip_address():
# 查询本机ip
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(('1.82.82.8', 280)) # 可随意填一个不能ping通的
ip = s.getsockname()[0]
s.close()
return ip
except Exception as e:
return e
def service_logging(self, content):
# 记录日志
log_path = '/root/service_assurance_check'
if not os.path.isdir(log_path):
os.makedirs(log_path)
log_name = '{}-{}.logs'.format('service_assurance_check', datetime.datetime.now().strftime('%Y-%m-%d'))
file_name = os.path.join(log_path, log_name)
with open(file_name, 'a+') as f:
now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
contents = '{}\t{}\t{}\n'.format(now, self.ip_address() ,content)
f.write(contents)
def keep_five_log_file(self):
# 只保留五个日志文件
log_path = "/root/service_assurance_check"
log_command = "ls -at {}|grep -v '^\.'|head -5".format(log_path)
stdout, error, code = self.system_command(log_command)
save_log_name_list = stdout.strip().split('\n')
remove_log_list = os.listdir(log_path)
remove_log_list = [i for i in remove_log_list if i not in save_log_name_list]
for file in remove_log_list:
remove_file_path = os.path.join(log_path, file)
remove_file_command = 'rm -rf {}'.format(remove_file_path)
self.system_command(remove_file_command)
def port_checker(self):
# 端口检测
service_down = list()
# for port in [8121, 8122, 8123]:
for port in [8121, 8122, 8123]:
command = "/usr/sbin/ss -anltp |grep -E '\<.*:{}\>'".format(port)
stdout, stderr, code = self.system_command(command)
print(stdout)
if not stdout:
log = 'port\t{}\t{}'.format(port, 'down')
self.service_logging(log)
service_down.append(port)
return len(service_down)
def service_status(self, service_name):
# 活跃状态检测
command = "systemctl status %s|grep -Eo 'Active:\s\w+'|awk -F ':' '{print $NF}'" % service_name
stdout, stderr, code = self.system_command(command)
return stdout.strip()
def service_checker(self):
# 检测服务挂掉的数量
service_down = list()
services_sequence = [
'bluesky', 'CenterControlUnit', 'TSManager', 'ProcessWatcher', 'WebExpress', 'mxagentrun'
]
for service_name in services_sequence:
status = self.service_status(service_name)
if status != 'active':
log = '{}\t{}'.format(service_name, 'not active')
self.service_logging(log)
service_down.append(service_name)
return len(service_down)
def service_stop(self):
# 停止服务
stop_sequence = [
'WebExpress', 'TSManager', 'CenterControlUnit', 'ProcessWatcher', 'mxagentrun', 'bluesky'
]
for service_name in stop_sequence:
self.system_command('systemctl stop {} && sleep 0.5'.format(service_name))
def service_start(self):
# 启动服务
start_sequence = [
'bluesky', 'CenterControlUnit', 'TSManager', 'ProcessWatcher', 'WebExpress', 'mxagentrun'
]
for service_name in start_sequence:
self.system_command('systemctl start {} && sleep 0.5'.format(service_name))
def run(self):
if (self.service_checker() > 0) or (self.port_checker() > 0):
self.service_stop()
self.service_start()
self.keep_five_log_file()
if __name__ == '__main__':
cloudwise = SingleNodeDeploy()
cloudwise.run()
python 服务重启脚本
最新推荐文章于 2023-06-19 00:32:01 发布