幻兽帕鲁服务器自动重启备份-python

news2024/9/22 5:31:57

幻兽帕鲁服务器自动重启备份-python

  • 1. 前置知识点
  • 2. 目录结构
  • 3. 代码内容
  • 4. 原理解释
  • 5. 额外备注

基于python编写的服务器全自动管理工具,能够实现自动定时备份存档,以及在检测到服务器崩溃之后自动重新启动,并且整合了对于frp端口转发工具的自动重启。

我受够这个服务器没完没了的崩溃了,别再整天艾特我开服了

如果对你的部署很有用,欢迎评论和点赞~

1. 前置知识点

幻兽帕鲁开服教程——游戏
架设游戏私服——内网穿透工具frp

需要掌握基本python编程知识,知道怎么部署python环境与修改配置路径。

2. 目录结构

|-pal_server_manage.bat
|-pal_server_manage.py

3. 代码内容

pal_server_manage.bat
这就是一个单纯方便双击启动运行的脚本。

python D:\servers\pal_server_manage.py

pal_server_manage.py
包含了初始化启动、自动备份与自动重启的功能。

import os
import time
import zipfile
import socket
import threading
import psutil
import subprocess


# 参数配置
class Config:
    # 服务器路径
    server_path = r"D:\servers\steamcmd\steamapps\common\PalServer\PalServer.exe"

    # 计算服务器应用程序名字
    server_name = os.path.split(server_path)[-1]

    # frp路径
    frp_path = r"D:\servers\frp\client\frpc.exe"
    frp_config = r"D:\servers\frp\client\frpc.ini"
    frp_name = os.path.split(frp_path)[-1]

    # 记录正在运行的服务器
    server = None
    frp = None

    # 是否使用自动重启
    use_auto_restart = True
    # 检测服务器是否在运行的间隔(秒)
    check_server_run_step = 10

    # 是否启动自动备份
    use_auto_backup = True
    # 备份的路径
    save_dir_path = r"D:\servers\steamcmd\steamapps\common\PalServer\Pal\Saved"
    # 备份的时间间隔(秒)
    save_time_step = 900
    # 备份的存档路径
    output_zip_path = r"D:\servers\save_backups\pal_save_backups"
    os.makedirs(os.path.split(output_zip_path)[-1], exist_ok=True)


# 将1个文件夹打包压缩为zip文件
def zip_file(src_dir, zip_path):
    z = zipfile.ZipFile(zip_path, 'w', zipfile.ZIP_DEFLATED)
    count = 0
    for dirpath, _, filenames in os.walk(src_dir):
        fpath = dirpath.replace(src_dir, '')
        fpath = fpath and fpath + os.sep or ''
        length = len(filenames)
        for filename in filenames:
            z.write(os.path.join(dirpath, filename), os.path.split(src_dir)[1] + fpath + filename)
            count += 1
            print(f'\rzip file: {count}/{length}', end='')
    print(f'\nzip {src_dir} success!')
    z.close()


# 检测程序是否在运行
def is_program_running(program_name):
    # 扫描所有的进程id
    for pid in psutil.pids():
        try:
            # 如果进程名与服务器名一致,代表服务器正在运行
            if psutil.Process(pid).name() == program_name:
                return True
        except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
            pass
    # 扫描所有进程后,未找到服务器
    return False


# 获取当前可视化时间信息
def get_local_time():
    local = time.localtime(time.time())
    now = f"{local[0]:04d}_{local[1]:02d}_{local[2]:02d}_{local[3]:02d}_{local[4]:02d}_{local[5]:02d}"
    return now


# 自动备份线程
class auto_server_backup(threading.Thread):
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name

    def run(self):
        while True:
            # 压缩存档文件夹到备份路径
            now = get_local_time()
            zip_path = os.path.join(Config.output_zip_path, now + ".zip")
            zip_file(Config.save_dir_path, zip_path)
            print(f"{now}: zip file from {Config.save_dir_path} to {zip_path}")
            # 休眠等待
            time.sleep(Config.save_time_step)


# 自动重启线程
class auto_server_restart(threading.Thread):
    def __init__(self, threadID, name):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name

    def run(self):
        while True:
            # 如果frp没有启动,就启动它
            if not is_program_running(Config.frp_name):
                now = get_local_time()
                Config.frp = subprocess.Popen(["start", Config.frp_path, "-c", Config.frp_config])
                print(f"{now}: Restart frp {Config.frp_path}")

            # 如果服务器没有启动,就启动它
            if not is_program_running(Config.server_name):
                now = get_local_time()
                Config.server = subprocess.Popen([Config.server_path])
                print(f"{now}: Restart Server {Config.server_path}")

            # 休眠等待
            time.sleep(Config.check_server_run_step)


def main():
    # 检查服务器是否启动
    # 如果frp没有启动,就启动它
    if not is_program_running(Config.frp_name):
        Config.frp = subprocess.Popen([Config.frp_path, "-c", Config.frp_config])
        print(f"Start frp {Config.frp_path}")
    # 如果服务器没有启动,就启动它
    if not is_program_running(Config.server_name):
        Config.server = subprocess.Popen([Config.server_path])
        print(f"Start Server {Config.server_path}")

    # 自动保存线程
    if Config.use_auto_backup:
        thread_backup = auto_server_backup(1, "backup")
        thread_backup.start()

    # 自动重启线程
    if Config.use_auto_restart:
        thread_restart = auto_server_restart(2, "restart")
        thread_restart.start()

    # 在子线程结束前不要终止,也就是无限堵塞
    if Config.use_auto_backup:
        thread_backup.join()
    if Config.use_auto_restart:
        thread_restart.join()


if __name__ == "__main__":
    main()
    

4. 原理解释

自动备份:定时压缩服务器存档文件夹到备份路径,非常简单粗暴。
注:因为没有在服务器内部运行保存命令,有极小概率可能出现玩家与世界存档不同步的问题,但是因为发生概率太低而且只要加快保存频率就不是什么大问题(其实是懒得整那么麻烦的东西),所以选择性无视了此问题。

自动保存:定时扫描所有进程,检测服务器是否在运行,发现没有在运行,就重新启动~

5. 额外备注

如果你希望主动定时关闭服务器重启,可以用该代码主动关闭服务器:

Config.server.kill()

祝大家玩得开心呀~上班当帕鲁已经够苦了,下班后都开心点吧!
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web 技术栈有哪些?

前端技术栈: HTML(超文本标记语言): 用于创建网页结构的标记语言,定义页面的内容和结构。 CSS(层叠样式表): 用于设计和排版网页的样式表语言,负责页面的外观和样式。 …

蓝桥杯嵌入式第七届真题(完成) STM32G431

蓝桥杯嵌入式第七届真题(完成) STM32G431 题目 相关文件 main.c /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program body**********************…

NuxtJs安装Sass后出现ERROR:Cannot find module ‘webpack/lib/RuleSet‘

最近了解NuxtJs时,发现问题比较多,对于初学者来说是件比较头痛的事。这次是安装sass预处理器,通过命令安装后,出现了ERROR:Cannot find module webpack/lib/RuleSet 错误,于是根据之前经验,对版…

软件测试Bug系列之4个基本步骤(一)

目录 1.发现bug 2.提交bug 3.跟踪bug 4.总结bug 只要你一个测试人员 ,就肯定离不开提交bug,跟踪bug的工作 。对于大多数的功能测试人员来说 ,占比最多的工作就是和bug打交道 。可以说它是我们最重要的一块业绩 。所以,有必要静…

Python 连接 mysql 详解(mysql-connector-python)

文章目录 1 概述1.1 第三方库:mysql-connector-python1.2 可视化工具:navicat1.3 创建测试数据库 2 连接 mysql 数据库2.1 创建一个连接2.2 捕获连接异常2.3 从配置文件中获取连接信息 3 执行 sql 语句3.1 插入、更新、删除3.2 查询 1 概述 1.1 第三方库…

MySQL 小技巧:使用 xtrabackup 2.4 实现 完全备份及还原

演示:使用 xtrabackup 2.4 实现 完全备份及还原 本案例基于 CentOS 7 的 Mariadb5.5 实现,也支持 MySQL5.5 和 MySQL5.7 1) 安装 xtrabackup 包 // 先安装 Mariadb5.5 和 xtrabackup 包 [rootcentos7 ~] yum install mariadb-server -y [rootcentos7 ~]…

备份RK35XX 设备的ubuntu根文件系统的方法

简介 我们使用 RK35XX 提供的SDK包制作了一个完整的 ubuntu 镜像,烧录到设备中,会在设备中安装很多我们需要的软件,运行的一些自己写的脚本和业务程序,当我们有很多台设备时,不可能每台都一个个去安装,此时我们就需要一个工具来备份当前设备的根文件系统,然后再放到 SD…

面试八股文(3)

文章目录 1.HashSet如何检查重复2.comparable和Comparator区别3.ConcurrentHashMap和Hashtable区别4.线程和进程5.并发与并行的区别6.为什么使用多线程7.使用多线程可能带来问题8.线程的生命周期和状态9.什么是上下文切换10.线程死锁11.产生死锁四个条件12.如何避免死锁 1.Hash…

【项目日记(八)】第三层: 页缓存的具体实现(下)

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:项目日记-高并发内存池⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你做项目   🔝🔝 开发环境: Visual Studio 2022 项目日…

在windows和Linux中的安装 boost 以及 安装 muduo 和 mysql

一、CMake安装 Ubuntu Linux 下安装和卸载cmake 3.28.2版本-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/135960115?spm1001.2014.3001.5501二、安装boost boost官网:boost官网 我下载的boost版本: windows:boost_1_84_0.zipli…

基于SpringBoot的家电销售展示网页的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式 🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 &…

k8s Sidecar filebeat 收集容器中的trace日志和app日志

目录 一、背景 二、设计 三、具体实现 Filebeat配置 K8S SideCar yaml Logstash配置 一、背景 将容器中服务的trace日志和应用日志收集到KAFKA,需要注意的是 trace 日志和app 日志需要存放在同一个KAFKA两个不同的topic中。分别为APP_TOPIC和TRACE_TOPIC 二、…

vulhub中spring的CVE-2022-22947漏洞复现

Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本(包含)以前存在一处SpEL表达式注入漏洞,当攻击者可以访问Actuator API的情况下,将可以利用该漏洞执行任意命令。 参考链接: https://tanzu.vmware.c…

SpringBoot security 安全认证(三)——自定义注解实现接口放行配置

背景:通过Security实现了安全管理,可以配置哪些接口可以无token直接访问。但一个麻烦就是每增加一个匿名访问接口时都要去修改SecurityConfig配置,从程序设计上讲是不太让人接受的。 本节内容:即是解决以上问题,增加一…

获取未来的5分钟整点时间05,10,15,20,25...

比如预约网约车的时候,是按5分钟的整点时间 GetMapping("/getFiveNextTime")public String fiveNextTime(RequestParam(defaultValue "0") Integer interval) {Calendar calendar Calendar.getInstance();calendar.add(Calendar.MINUTE, (5 …

MySQL进阶45讲【13】为什么表数据删掉一半,表文件大小不变?

1 前言 有些小伙伴在删数据库数据时,会产生一个疑问,我的数据库占用空间大,我把一个最大的表删掉了一半的数据,怎么表文件的大小还是没变? 那么这篇文章,就介绍一下数据库表的空间回收,看看如…

以太网帧格式及ARP协议简介

在以太网中,一个主机和另一个主机进行通信,必须要知道目的主机的MAC地址(物理地址),只要知道目的主机的IP地址,就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP(Address Resolut…

leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

297.二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现…

C语言-2

自定义类型 基本认识 /*引入:学生:姓名,学号,年龄,成绩请为学生们专门定制一个类型(创造一个类型)结构体格式:struct 标识符 // 标识符即自定义类型的名称{成员; // 自己设置…