自动化服务器重启工具reboot-p:轻松实现高效重启

一、使用介绍

reboot-p是一款基于Python开发的自动化服务器重启工具。通过使用reboot-p,你能够轻松实现定时或者手动重启服务器,从而提升服务器的性能和稳定性。

使用reboot-p的好处在于,它能够帮你省去手动登录服务器执行重启操作的麻烦,而且能够轻松实现配置管理和计划管理,提高效率。

下面是使用reboot-p的步骤说明:

1.安装reboot-p

pip install reboot-p

2.配置服务器信息

reboot-p config -s SERVER_IP -u USERNAME -p PASSWORD

3.检查服务器列表

reboot-p list # 查看已经配置好的服务器列表

4.添加计划任务

reboot-p add -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR

5.执行任务

reboot-p run -t TASK_NAME

6.查看任务日志

reboot-p logs -t TASK_NAME

通过以上6个步骤,即可轻松使用reboot-p实现服务器重启。

二、定时任务管理

reboot-p提供了计划任务管理的功能,使得用户可以通过简单配置实现自动化的重启操作。下面是计划任务管理的几个方面的详细阐述:

1.添加计划任务

添加计划任务需要设置服务器、任务名称、间隔时间、时区、重启时间段等,在执行时,reboot-p会按照设定的时间自动执行重启操作,从而实现高效管理。

reboot-p add -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR

2.查看任务列表

reboot-p提供了list命令可以帮助你查看已经配置好的计划任务列表,方便你进行任务的管理和维护。使用方法如下:

reboot-p list

3.编辑计划任务

在实际场景中,你可能需要对已经配置好的任务进行调整,reboot-p提供了edit命令帮助你进行任务编辑,具体使用方法如下:

reboot-p edit -s SERVER_NAME -t TASK_NAME -i INTERVAL -t TIME_ZONE --start-hour START_HOUR --end-hour END_HOUR

4.删除计划任务

如果不需要某个计划任务,你可以使用delete命令来删除对应的任务。使用方法如下:

reboot-p delete -t TASK_NAME

三、手动重启管理

除了定时任务重启,reboot-p还提供了手动重启的功能。通过手动重启,你可以灵活地根据需求执行重启操作。下面是手动重启的几个方面的详细说明:

1.手动重启

手动重启非常简单,只需要在命令行中执行下面的命令即可:

reboot-p reboot -s SERVER_NAME

2.查看服务器状态

reboot-p提供了status命令可以帮助你查看服务器当前的状态,具体使用方法如下:

reboot-p status -s SERVER_NAME

3.手动关机

在某些特殊的情况下,你可能需要手动关机,reboot-p也提供了shutdown命令帮助你实现服务器的关机。使用方法如下:

reboot-p shutdown -s SERVER_NAME

四、代码示例

下面是reboot-p的核心代码,你可以参考它进行二次开发和灵活扩展:


import paramiko
import argparse
import yaml
import time
import logging
import logging.handlers

logging.basicConfig()
logger = logging.getLogger('reboot-p')
logger.setLevel(logging.INFO)
handler = logging.handlers.RotatingFileHandler('reboot-p.log', maxBytes=20 * 1024 * 1024, backupCount=5)
handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
logger.addHandler(handler)

class RebootClient:

    def __init__(self, server_config):
        self.ssh = paramiko.SSHClient()
        self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.ssh.connect(server_config['ip'], username=server_config['username'], password=server_config['password'])

    def reboot(self):
        try:
            logger.info('开始重启服务器...')
            self.ssh.exec_command('sudo reboot')
            logger.info('重启命令已发送,请稍等...')
            time.sleep(60)
            logger.info('重启成功!')
        except Exception as e:
            logger.error('重启失败:{}'.format(str(e)))
        finally:
            self.ssh.close()

    def shutdown(self):
        try:
            logger.info('开始关机操作...')
            self.ssh.exec_command('sudo shutdown -h now')
            logger.info('关机命令已发送,请稍等...')
            time.sleep(5)
            logger.info('关机成功!')
        except Exception as e:
            logger.error('关机失败:{}'.format(str(e)))
        finally:
            self.ssh.close()

    def check_status(self):
        try:
            stdin, stdout, stderr = self.ssh.exec_command('uptime')
            lines = stdout.readlines()
            logger.info('服务器{}当前状态:{}'.format(self.name, lines[0].strip()))
        except Exception as e:
            logger.error('状态查询失败:{}'.format(str(e)))
        finally:
            self.ssh.close()

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='reboot-p: a simple tool for rebooting remote server')
    parser.add_argument('command', help='command to run: config, add, delete, edit, list, run, logs, reboot, shutdown, status')
    parser.add_argument('-s', '--server-name', help='server name', dest='name')
    parser.add_argument('-i', '--interval', help='reboot interval in minutes', type=int)
    parser.add_argument('-t', '--timezone', help='time zone for task', default='Asia/Shanghai')
    parser.add_argument('--start-hour', help='start hour for reboot in 24 format', type=int)
    parser.add_argument('--end-hour', help='end hour for reboot in 24 format', type=int)
    parser.add_argument('-u', '--username', help='server username', dest='username')
    parser.add_argument('-p', '--password', help='server password', dest='password')
    parser.add_argument('--task-name', help='task name')
    args = parser.parse_args()

    if args.command == 'config':
        with open('config.yml', 'w') as f:
            yaml.dump({'servers': []}, f, default_flow_style=False)
        print('配置文件已创建,请编辑config.yml文件,并重新运行reboot-p')

    with open('config.yml', 'r') as f:
        config = yaml.load(f, Loader=yaml.FullLoader)

    if args.command == 'add':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        tasks = []
        if 'tasks' in server_config:
            tasks = server_config['tasks']

        task = {
            'name': args.task_name,
            'interval': args.interval,
            'timezone': args.timezone,
            'start_hour': args.start_hour,
            'end_hour': args.end_hour
        }
        tasks.append(task)
        server_config['tasks'] = tasks

        with open('config.yml', 'w') as f:
            yaml.dump(config, f, default_flow_style=False)
            print('服务器 {} 添加任务成功!'.format(args.name))

    elif args.command == 'delete':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        tasks = []
        if 'tasks' in server_config:
            tasks = server_config['tasks']

        tasks = [t for t in tasks if t['name'] != args.task_name]
        server_config['tasks'] = tasks

        with open('config.yml', 'w') as f:
            yaml.dump(config, f, default_flow_style=False)
            print('服务器 {} 删除任务成功!'.format(args.name))

    elif args.command == 'edit':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        tasks = []
        if 'tasks' in server_config:
            tasks = server_config['tasks']

        task = [t for t in tasks if t['name'] == args.task_name][0]
        task['interval'] = args.interval
        task['timezone'] = args.timezone
        task['start_hour'] = args.start_hour
        task['end_hour'] = args.end_hour

        with open('config.yml', 'w') as f:
            yaml.dump(config, f, default_flow_style=False)
            print('服务器 {} 编辑任务成功!'.format(args.name))

    elif args.command == 'list':
        for server in config['servers']:
            print('服务器:{}'.format(server['name']))
            tasks = []
            if 'tasks' in server:
                tasks = server['tasks']
            for task in tasks:
                print('    任务:{}'.format(task['name']))
                print('    间隔时间:{}分钟'.format(task['interval']))
                print('    时区:{}'.format(task['timezone']))
                print('    重启时间:{}点到{}点'.format(task['start_hour'], task['end_hour']))

    elif args.command == 'run':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        tasks = []
        if 'tasks' in server_config:
            tasks = server_config['tasks']
        
        task = [t for t in tasks if t['name'] == args.task_name][0]
        client = RebootClient(server_config)
        client.reboot()
    
    elif args.command == 'logs':
        logger.setLevel(logging.DEBUG)
        logger.handlers.clear()
        handler = logging.handlers.RotatingFileHandler('reboot-p.log', maxBytes=20 * 1024 * 1024, backupCount=5)
        handler.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
        logger.addHandler(handler)

    elif args.command == 'reboot':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        client = RebootClient(server_config)
        client.reboot()

    elif args.command == 'shutdown':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        client = RebootClient(server_config)
        client.shutdown()

    elif args.command == 'status':
        server_config = [s for s in config['servers'] if s['name'] == args.name][0]
        if not server_config:
            print('未找到服务器 {}'.format(args.name))
            exit(1)

        client = RebootClient(server_config)
        client.check_status()

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/187946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-28 06:26
下一篇 2024-11-28 06:27

相关推荐

  • 服务器安装Python的完整指南

    本文将为您提供服务器安装Python的完整指南。无论您是一位新手还是经验丰富的开发者,您都可以通过本文轻松地完成Python的安装过程。以下是本文的具体内容: 一、下载Python…

    编程 2025-04-29
  • STUN 服务器

    STUN 服务器是一个网络服务器,可以协助网络设备(例如 VoIP 设备)解决 NAT 穿透、防火墙等问题,使得设备可以正常地进行数据传输。本文将从多个方面对 STUN 服务器做详…

    编程 2025-04-29
  • 解决docker-compose 容器时间和服务器时间不同步问题

    docker-compose是一种工具,能够让您使用YAML文件来定义和运行多个容器。然而,有时候容器的时间与服务器时间不同步,导致一些不必要的错误和麻烦。以下是解决方法的详细介绍…

    编程 2025-04-29
  • Trocket:打造高效可靠的远程控制工具

    如何使用trocket打造高效可靠的远程控制工具?本文将从以下几个方面进行详细的阐述。 一、安装和使用trocket trocket是一个基于Python实现的远程控制工具,使用时…

    编程 2025-04-28
  • Python生成列表最高效的方法

    本文主要介绍在Python中生成列表最高效的方法,涉及到列表生成式、range函数、map函数以及ITertools模块等多种方法。 一、列表生成式 列表生成式是Python中最常…

    编程 2025-04-28
  • 如何选择MySQL服务器文件权限

    MySQL是一种流行的关系型数据库管理系统。在安装MySQL时,选择正确的文件权限是保证安全和性能的重要步骤。以下是一些指导您选择正确权限的建议。 一、权限选择 MySQL服务器需…

    编程 2025-04-27
  • JPRC – 轻松创建可读性强的 JSON API

    本文将介绍一个全新的 JSON API 框架 JPRC,通过该框架,您可以轻松创建可读性强的 JSON API,提高您的项目开发效率和代码可维护性。接下来将从以下几个方面对 JPR…

    编程 2025-04-27
  • TFN MR56:高效可靠的网络环境管理工具

    本文将从多个方面深入阐述TFN MR56的作用、特点、使用方法以及优点,为读者全面介绍这一高效可靠的网络环境管理工具。 一、简介 TFN MR56是一款多功能的网络环境管理工具,可…

    编程 2025-04-27
  • 用Pythonic的方式编写高效代码

    Pythonic是一种编程哲学,它强调Python编程风格的简单、清晰、优雅和明确。Python应该描述为一种语言而不是一种编程语言。Pythonic的编程方式不仅可以使我们在编码…

    编程 2025-04-27
  • Python生成10万条数据的高效方法

    本文将从以下几个方面探讨如何高效地生成Python中的10万条数据: 一、使用Python内置函数生成数据 Python提供了许多内置函数可以用来生成数据,例如range()函数可…

    编程 2025-04-27

发表回复

登录后才能评论