python 服务重启脚本

#!/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()



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值