前言
最近有个需求,在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 为系统服务(建议)
-
下载 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 Supervisor
echo Service Supervisor installed and started.
pause
✅ 总结
目标 | 已解决方式 |
---|---|
启动 N 个子进程 | manager.py 自动读取 CPU 数 |
异常自动重启 | 每个进程/manager 均守护重启 |
开机启动 | 使用 NSSM 注册为系统服务 |
日志记录 | 日志按进程编号保存到 logs 目录 |