windows服务器下自启动后台运行python脚本
前言
最近有个需求,在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 Threaddef 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 osMANAGER_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 为系统服务(建议)
-
下载 NSSM:
官网:https://nssm.cc/download -
解压,命令行打开 NSSM 目录,运行:
nssm install Supervisor
- 在弹窗中配置:
- Path:
C:\python.exe
- Arguments:
supervisor.py
- Startup Directory:
C:\workspace
-
点击 “Install service”
-
启动服务:
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 Supervisorecho Service Supervisor installed and started.
pause
✅ 总结
目标 | 已解决方式 |
---|---|
启动 N 个子进程 | manager.py 自动读取 CPU 数 |
异常自动重启 | 每个进程/manager 均守护重启 |
开机启动 | 使用 NSSM 注册为系统服务 |
日志记录 | 日志按进程编号保存到 logs 目录 |