自動化服務器重啟工具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/zh-hk/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

發表回復

登錄後才能評論