幻兽帕鲁服务器自动重启备份-python
幻兽帕鲁服务器自动重启备份-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 = Nonefrp = 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 = 0for 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 += 1print(f'\rzip file: {count}/{length}', end='')print(f'\nzip {src_dir} success!')z.close()# 检测程序是否在运行
def is_program_running(program_name):# 扫描所有的进程idfor pid in psutil.pids():try:# 如果进程名与服务器名一致,代表服务器正在运行if psutil.Process(pid).name() == program_name:return Trueexcept (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 = threadIDself.name = namedef 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 = threadIDself.name = namedef 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()
祝大家玩得开心呀~上班当帕鲁已经够苦了,下班后都开心点吧!

相关文章:
幻兽帕鲁服务器自动重启备份-python
幻兽帕鲁服务器自动重启备份-python 1. 前置知识点2. 目录结构3. 代码内容4. 原理解释5. 额外备注 基于python编写的服务器全自动管理工具,能够实现自动定时备份存档,以及在检测到服务器崩溃之后自动重新启动,并且整合了对于frp端口转发工具的…...
C# Onnx yolov8 水表读数检测
目录 效果 模型信息 项目 代码 训练数据 下载 C# Onnx yolov8 水表读数检测 效果 模型信息 Model Properties ------------------------- date:2024-01-31T10:18:10.141465 author:Ultralytics task:detect license:AGPL-…...
负载均衡下webshell连接
目录 一、什么是负载均衡 分类 负载均衡算法 分类介绍 分类 均衡技术 主要应用 安装docker-compose 2.1上传的文件丢失 2.2 命令执行时的漂移 2.3 大工具投放失败 2.4 内网穿透工具失效 3.一些解决方案 总结 一、什么是负载均衡 负载均衡(Load Balanc…...
Spring面试大全-基础知识01
1.什么是Spring Spring框架是用于构建企业级Java的开源框架,他通过依赖注入和IOC容器帮我我们管理对象;支持AOP,将非业务功能(日志,事务等)从我们业务代码中分离出来,提高了代码的可维护性&…...
Transformer实战-系列教程4:Vision Transformer 源码解读2
🚩🚩🚩Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 4、Embbeding类 self.embeddings Embeddings(config, img_sizeimg_size) class Embeddings(nn.…...
cesium-水平测距
cesium测量两点间的距离 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item&…...
【Android-Compose】手势检测实现按下、单击、双击、长按事件,以及避免频繁单击事件的简单方法
目录: 1 不需要双击事件 规避频繁单击事件2 需要双击事件(常规写法)3 后记:不建议使用上面的代码自定义按钮 1 不需要双击事件 规避频繁单击事件 var firstClickTime by remember { mutableStateOf(System.currentTimeMillis()…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于神经网络的CAN总线负载率优化(续)
目录 3.3 SA 算法 3.3.1 SA 算法原理 3.3.2 基于 SA 算法 CAN 总线负载率优化分析...
python爬虫6—高性能异步爬虫
如果有多个URL等待我们爬取,我们通常是一次只能爬取一个,爬取效率低,异步爬虫可以提高爬取效率,可以一次多多个URL同时同时发起请求 异步爬虫方式: 一、多线程、多进程(不建议):可以…...
日历功能——C语言
实现日历功能,输入年份月份,输出日历 #include<stdio.h>int leap_year(int year) {if(year % 4 0 && year % 100 ! 0 || year % 400 0){return 1;}else{return 0;} }int determine_year_month_day(int *day,int month,int year) {if(mo…...
GPIO中断
1.EXTI简介 EXTI是External Interrupt的缩写,指外部中断。在嵌入式系统中,外部中断是一种用于处理外部事件的机制。当外部事件发生时(比如按下按钮、传感器信号变化等),外部中断可以立即打断正在执行的程序࿰…...
springboot完成一个线上图片存放地址+实现前后端上传图片+回显
1.路径 注意路径 2.代码:(那个imagePath没什么用,懒的删了),注意你的本地文件夹要有图片,才可以在线上地址中打开查看 package com.xxx.common.config;import org.springframework.beans.factory.annotat…...
编程思维与生活琐事的内在关联及其应用价值
随着科技的日益普及和信息化时代的到来,编程作为一种现代技能,其影响已不再局限于专业领域,而是逐步渗透到人们的日常生活之中。探讨编程与生活琐事之间的关系,有助于我们更好地理解如何将技术智慧应用于日常管理,提升…...
OSPF排错
目录 实验拓扑图 实验要求 实验排错 故障一 故障现象 故障分析 故障解决 故障二 故障现象 故障分析 故障解决 故障三 故障现象 故障分析 故障解决 故障四 故障现象 故障分析 故障解决 故障五 故障现象 故障分析 故障解决 故障六 故障现象 故障分析 …...
day07-CSS高级
01-定位 作用:灵活的改变盒子在网页中的位置 实现: 1.定位模式:position 2.边偏移:设置盒子的位置 left right top bottom 相对定位 position: relative 特点: 不脱标,占用自己原来位置 显示模…...
05 MP之ActiveRecord模式+SimpleQuery
1. ActiveRecord ActiveRecord(活动记录,简称AR),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。 其目标是通过围绕一个数据对象, 进行全部的CRUD操作。 1.1 让实体类…...
git diff查看比对两次不同时间点提交的异同
git diff查看比对两次不同时间点提交的异同 用 git diff命令: git diff commit-id-1 commit-id-2 不同commit-id在不同的时间点提交产生,因为也可以认为git diff是比对两个不同时间点的代码异同。 git diff比较不同commit版本的代码文件异同_git diff c…...
基于muduo网络库开发服务器程序和CMake构建项目 笔记
跟着施磊老师做C项目,施磊老师_腾讯课堂 (qq.com) 一、基于muduo网络库开发服务器程序 组合TcpServer对象创建EventLoop事件循环对象的指针明确TcpServer构造函数需要什么参数,输出ChatServer的构造函数在当前服务器类的构造函数当中,注册处理连接的回调函数和处理…...
前端支持下载模板、导入数据、导出数据(excel格式)
前言 xlsx是由SheetJS开发的一个处理excel文件的npm库,适用于前端开发者实现下载模板、导入导出excel文件等需求,演示的项目的技术栈为vue3 elementPlus 一. 引入xlsx 安装xlsx npm install xlsx引入xlsx import * as XLSX from xlsx;二. 下载模板 const han…...
编译Faiss-gpu【InterMKL】C++ 按步骤操作 基本不会有问题的 python原理相同。
编译Faiss-gpu C++ 基本介绍 使用Faiss版本【1.7.4】 该项目依赖于BLAS 组件 OpenBLAS 和 IntelMKL BLAS 【官方支持】 IntelMKL 会比 OpenBLAS 快的多。 【来自官方结论】 本机环境 Cuda :11.1 Cuda-Driver: 515 InterMKL: 2021.2.0 Faiss :1.7.4 注意:faiss仅…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
基于Java+VUE+MariaDB实现(Web)仿小米商城
仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意:运行前…...
十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...
