windows服务器下自启动后台运行python脚本

news2025/5/17 9:39:45

前言

最近有个需求,在windows下根据系统的cpu核数,运行python脚本,记录下在windows注册服务,后台运行python脚本

目录

    • 前言
    • ✅ 一、目录结构(示例)
    • ✅ 二、manager.py(启动与 CPU 数相同的子进程,并写日志)
    • ✅ 三、supervisor.py(守护 manager.py)
    • ✅ 四、安装 NSSM 为系统服务(建议)
    • ✅ 五、服务控制命令
    • 📝 可选:一键注册服务 `.bat` 示例(register\_service.bat)
    • ✅ 总结

✅ 一、目录结构(示例)

C:\workspace\
│
├── manager.py        # 管理 CPU 核数子进程
├── supervisor.py     # 守护 manager.py
├── logs\
│   └── manager-1.log, manager-2.log ...
├── 

✅ 二、manager.py(启动与 CPU 数相同的子进程,并写日志)

import multiprocessing
import subprocess
import time
import sys
import os
from threading import Thread

def run_worker(python_exe, script_path, idx):
    log_path = f"./logs/manager-{idx}.log"
    os.makedirs(os.path.dirname(log_path), exist_ok=True)

    while True:
        with open(log_path, "a", encoding="utf-8") as f:
            print(f"[Worker-{idx}] Starting process...")
            try:
                p = subprocess.Popen(
                    [python_exe, script_path],
                    stdout=f,
                    stderr=subprocess.STDOUT
                )
                p.wait()
                print(f"[Worker-{idx}] Process exited with code {p.returncode}")
            except Exception as e:
                f.write(f"[Worker-{idx}] Error: {e}\n")
            f.write(f"[Worker-{idx}] Restarting in 2 seconds...\n")
        time.sleep(2)

def main():
    cpu_count = multiprocessing.cpu_count()
    print(f"CPU cores detected: {cpu_count}")

    python_exe = r"C:\python.exe"
    script_path = r"C:\workspace\webunlock.py"

    workers = []
    for i in range(cpu_count):
        t = Thread(target=run_worker, args=(python_exe, script_path, i + 1), daemon=True)
        t.start()
        workers.append(t)

    try:
        while True:
            time.sleep(10)
    except KeyboardInterrupt:
        print("Manager exiting...")

if __name__ == "__main__":
    main()

✅ 三、supervisor.py(守护 manager.py)

import subprocess
import time
import os

MANAGER_SCRIPT = r"C:\workspace\manager.py"
PYTHON_EXE = r"C:\python.exe"

def run_manager():
    log_path = r"C:\workspace\supervisor.log"
    os.makedirs(os.path.dirname(log_path), exist_ok=True)

    while True:
        with open(log_path, "a", encoding="utf-8") as f:
            try:
                print("Starting manager.py ...")
                p = subprocess.Popen([PYTHON_EXE, MANAGER_SCRIPT], stdout=f, stderr=subprocess.STDOUT)
                p.wait()
                f.write(f"[Supervisor] manager.py exited with code {p.returncode}\n")
            except Exception as e:
                f.write(f"[Supervisor] Error: {e}\n")
            f.write("[Supervisor] Restarting manager.py in 5 seconds...\n")
        time.sleep(5)

if __name__ == "__main__":
    run_manager()

✅ 四、安装 NSSM 为系统服务(建议)

  1. 下载 NSSM:
    官网:https://nssm.cc/download

  2. 解压,命令行打开 NSSM 目录,运行:

nssm install Supervisor
  1. 在弹窗中配置:
  • Path: C:\python.exe
  • Arguments: supervisor.py
  • Startup Directory: C:\workspace
  1. 点击 “Install service”

  2. 启动服务:

nssm start Supervisor

✅ 五、服务控制命令

nssm start Supervisor
nssm stop Supervisor
nssm restart Supervisor

📝 可选:一键注册服务 .bat 示例(register_service.bat)

@echo off
set PYTHON_EXE=C:\python.exe
set SUPERVISOR_PATH=C:\supervisor.py
set WORK_DIR=C:\workspace\

nssm install Supervisor %PYTHON_EXE% %SUPERVISOR_PATH%
nssm set Supervisor AppDirectory %WORK_DIR%
nssm start Supervisor

echo Service Supervisor installed and started.
pause

✅ 总结

目标已解决方式
启动 N 个子进程manager.py 自动读取 CPU 数
异常自动重启每个进程/manager 均守护重启
开机启动使用 NSSM 注册为系统服务
日志记录日志按进程编号保存到 logs 目录

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

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

相关文章

记录算法笔记(2025.5.15)将有序数组转换为二叉搜索树

给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…

Kubernetes 运维操作手册:从 etcd 快照进行精确恢复

1 5 步实现 etcd 精确恢复 将快照恢复到本地 etcd 数据目录。使用恢复的数据启动本地 etcd 实例。使用 etcdctl 查询特定键(例如,ConfigMap)。使用 auger 解码以提取干净的 YAML。使用 kubectl 申请恢复到您的实时集群。 本指南将指导您从 et…

云轴科技ZStack官网上线Support AI,智能助手助力高效技术支持

5月16日,云轴科技ZStack在官网(www.zstack.io)正式上线ZStack Support AI智能助手。该系统是ZStack应用人工智能于技术支持服务领域的重要创新,基于自研ZStack AIOS平台智塔及LLMOPS技术打造。 ZStack Support AI定位为智能客服&…

UE5中制作动态数字Decal

在进行城市道路编辑时,经常需要绘制人行道、交通标志、停车线等路面元素。如果能够使用具有动态修改功能的 Decal(贴花),将大大提升编辑效率和灵活性。接下来讲解如何制作。 1.首先准备一张包含所需元素的Texture,这里…

【踩坑】修复Cloudflare的Origin Rules端口重定向不生效

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 网上没人说,目前我是通过以下两种方式成功将二级域名映射到指定端口的。关于如何映射,网上教程很多,这里只说不生效…

2025 年十大网络安全预测

随着我们逐步迈向 2026 年,网络安全领域正处于一个关键的转折点,技术创新与数字威胁以前所未有的复杂态势交织在一起。 地缘政治环境进一步加剧了这些网络安全挑战,国际犯罪组织利用先进的技术能力来追求战略目标。 人工智能在这一不断演变…

紫外相机工作原理及可应用范围

紫外相机是一种利用紫外线(UV)波段进行成像的设备,紫外线可用于机器视觉应用中,以检测使用可见光无法检测到的特征,工业上使用最常见的紫外波长是365nm和395nm。紫外相机通常用于高分辨率视频显微镜、电晕检测、半导体…

【虚幻引擎】UE5独立游戏开发全流程(商业级架构)

本套课程我将会讲解一下知识 1.虚幻引擎的常用功能节点、模块包含但不限于动画模块、UI模块、AI模块、碰撞模块、伤害模块、背包模块、准心模块、武器模块、可拾取物品模块、死亡等模块。 2.整个游戏的设计思路(游戏架构),本套教程讲解了如…

嵌入式单片机中STM32F1演示寄存器控制方法

该文以STM32F103C8T6为示例,演示如何使用操作寄存器的方法点亮(关闭LED灯),并讲解了如何调试,以及使用宏定义。 第一:操作寄存器点亮LED灯。 (1)首先我们的目的是操作板子上的LED2灯,对其实现点亮和关闭操作。打开STM32F103C8T6的原理图,找到LED2的位置。 可以看到…

spark-cache模式

一、RDD持久化 1.什么时候该使用持久化(缓存) 2. RDD cache & persist 缓存 3. RDD CheckPoint 检查点 4. cache & persist & checkpoint 的特点和区别 特点 区别 二、cache & persist 的持久化级别及策略选择 Spark的几种持久化…

架构思维:通用架构模式_系统监控的设计

文章目录 引言什么是监控三大常见监控类型1. 次数监控2. 性能监控3. 可用率监控 落地监控1. 服务入口2. 服务内部3. 服务依赖 监控时间间隔的取舍小结 引言 架构思维:通用架构模式_从设计到代码构建稳如磐石的系统 架构思维:通用架构模式_稳如老狗的SDK…

InfluxDB 2.7 连续查询实战指南:Task 替代方案详解

InfluxDB 2.7 引入了 Task 功能,作为连续查询(CQ)的现代替代方案。本文详细介绍了如何使用 Task 实现传统 CQ 的功能,包括语法解析、示例代码、参数对比以及典型应用场景。通过实际案例和最佳实践,帮助开发者高效迁移并…

【SpringBoot】从零开始全面解析SpringMVC (二)

本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. 🐎文章专栏: JavaEE进阶 🚀若有问题 评论区见 👉gitee链接: 薯条不要番茄酱 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条…

蒟蒻编程日志

ORZ (用于记录你这个“人”是不是真的,也就是说CSDN的流量是否属合适) 2025/4/14 21:25 开坑 前言 2024/10/26:CSP-J 260pts,CSP-S 45pts。 2025/3/1:%你赛 180pts rk34 寄!这就是不认真的…

git克隆github项目到本地的三种方式

本文旨在使用git工具将别人发布在github上的项目保存到本地 1.安装git,创建github账户,并使用ssh关联自己的github账号和git,具体教程可以参照下面两篇文章: Github入门教程,适合新手学习(非常详细&#…

EtherCAT转EtherNet/IP解决方案-泗博网关CEI-382

一、应用场景 在智能制造快速发展的背景下,工业自动化领域对设备间通信提出了更高要求,需要同时满足实时性、可靠性和灵活性的需求。EtherCAT 与 EtherNet/IP 作为工业通信领域的两大核心协议,各自在不同应用场景中发挥着关键作用。EtherCAT …

子查询对多层join优化记录

需求背景 查询某个用户是否具有某个角色 表 CREATE TABLE mdm_platform_role_user (ID bigint NOT NULL AUTO_INCREMENT,ROLE_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,USER_ID varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci …

分布式AI推理的成功之道

随着AI模型逐渐成为企业运营的核心支柱,实时推理已成为推动这一转型的关键引擎。市场对即时、可决策的AI洞察需求激增,而AI代理——正迅速成为推理技术的前沿——即将迎来爆发式普及。德勤预测,到2027年,超半数采用生成式AI的企业…

PR-2021

推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统&#xf…

Linux复习笔记(六)shell编程

遇到的问题,都有解决方案,希望我的博客能为你提供一点帮助。 三、shell编程简明教程 一、Shell基础概念 ​​1. Shell的作用​​ 是用户与Linux内核交互的桥梁,既是命令解释器,也是一种脚本语言。运行机制:用户输入…