如何在Microsoft服务器上安装并24小时不间断运行Python脚本
嘿,刚好我之前在Windows Server上部署过类似的Python长期运行脚本,给你几个靠谱的方案,一步步来,你可以根据自己的需求选:
方案1:注册为Windows服务(最推荐,系统级持久运行)
这种方式最稳定,服务是系统级别的,开机自动启动,崩溃了还能配置自动重启,完全符合24小时不间断的需求。
步骤如下:
- 先做好前置检查:确保服务器上装了Python,把你的校验脚本传到服务器上,手动跑一遍确认能正常运行(重点检查依赖库有没有装、文件路径是不是绝对路径——别用相对路径,服务运行的工作目录和你手动跑的不一样!)。
- 安装服务依赖库:打开管理员命令提示符,运行
pip install pywin32。 - 写一个服务包装脚本:比如命名为
service_wrapper.py,把下面的代码复制进去,记得替换成你自己的脚本入口:
import win32serviceutil import win32service import win32event import servicemanager import socket import sys import os import time # 导入你的校验脚本主模块,比如你的脚本叫validation_script.py,就写import validation_script import validation_script class ValidationService(win32serviceutil.ServiceFramework): # 服务名称(内部用) _svc_name_ = "DataValidationService" # 服务显示名称(在服务管理器里看到的名字) _svc_display_name_ = "数据校验后台服务" # 服务描述 _svc_description_ = "24小时不间断运行Python数据校验脚本" def __init__(self, args): win32serviceutil.ServiceFramework.__init__(self, args) self.hWaitStop = win32event.CreateEvent(None, 0, 0, None) socket.setdefaulttimeout(60) self.is_running = True def SvcStop(self): # 处理服务停止请求 self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING) win32event.SetEvent(self.hWaitStop) self.is_running = False def SvcDoRun(self): # 服务启动时执行 servicemanager.LogMsg(servicemanager.EVENTLOG_INFORMATION_TYPE, servicemanager.PYS_SERVICE_STARTED, (self._svc_name_, '')) self.main_loop() def main_loop(self): # 这里是你的脚本运行逻辑,如果是持续监听就一直循环,定时执行就加sleep while self.is_running: try: # 调用你脚本里的核心校验函数,比如validation_script.run_check() validation_script.run_check() # 比如每30分钟跑一次,根据你的需求调整间隔 time.sleep(1800) except Exception as e: # 把错误日志写到文件里,方便排查 log_path = os.path.join(os.path.dirname(__file__), 'service_error.log') with open(log_path, 'a', encoding='utf-8') as f: f.write(f"{time.strftime('%Y-%m-%d %H:%M:%S')} - 错误信息: {str(e)}\n") # 出错后等1分钟再继续,避免死循环报错 time.sleep(60) if __name__ == '__main__': if len(sys.argv) == 1: servicemanager.Initialize() servicemanager.PrepareToHostSingle(ValidationService) servicemanager.StartServiceCtrlDispatcher() else: # 处理命令行参数(install/start/stop等) win32serviceutil.HandleCommandLine(ValidationService)
- 注册并启动服务:
- 打开管理员命令提示符,切换到脚本所在目录,运行
python service_wrapper.py install - 启动服务:可以在「服务」管理器里找到「数据校验后台服务」右键启动;或者命令行运行
python service_wrapper.py start - 如果后续修改了脚本,先停服务
python service_wrapper.py stop,重新安装python service_wrapper.py install,再启动即可。
- 打开管理员命令提示符,切换到脚本所在目录,运行
方案2:用Windows任务计划程序(适合定时执行的场景)
如果你的脚本不需要一直运行,而是每隔一段时间执行一次(比如每小时校验一次),用任务计划程序更简单,不需要写包装脚本。
步骤:
- 前置检查:和上面一样,确保脚本手动运行正常,用绝对路径。
- 创建任务:
- 打开「任务计划程序」,点击左侧「任务计划程序库」,然后点击右侧「创建基本任务」
- 填写任务名称(比如「数据定时校验」),描述,点击下一步
- 触发器选「每天」,然后设置重复间隔(比如每1小时重复一次,持续时间选「无限期」),点击下一步
- 操作选「启动程序」,「程序或脚本」选Python的安装路径(比如
C:\Python39\python.exe),「添加参数」填你的脚本绝对路径(比如C:\scripts\validation_script.py),「起始于」填脚本所在目录(比如C:\scripts),点击下一步 - 勾选「当单击完成时,打开此任务属性的对话框」,点击完成
- 配置高级属性:
- 在属性窗口切换到「设置」选项卡,勾选「如果任务失败,每隔X分钟重试」(比如5分钟),「允许任务在用户未登录时运行」(非常重要,这样服务器没人登录也能跑),如果服务器可能睡眠,再勾选「唤醒计算机运行此任务」
方案3:用NSSM工具(简单快捷,无需写服务包装脚本)
NSSM是一个第三方工具,能把任意程序包装成Windows服务,比写pywin32脚本简单很多,适合不想折腾代码的情况。
步骤:
- 下载NSSM:去官网下载对应服务器系统的版本(32/64位),解压到某个目录(比如
C:\nssm),把这个目录加到系统环境变量PATH里(方便命令行调用)。 - 安装服务:
- 打开管理员命令提示符,运行
nssm install DataValidationService,会弹出图形配置界面 - 「Application」选项卡:
- Path:选Python的exe路径(比如
C:\Python39\python.exe) - Arguments:填你的脚本绝对路径(
C:\scripts\validation_script.py) - Working Directory:填脚本所在目录(
C:\scripts)
- Path:选Python的exe路径(比如
- 「Recovery」选项卡:设置服务失败后的操作,比如「第一次失败:重启服务」,「第二次失败:重启服务」,「后续失败:重启服务」,重启间隔设为1分钟
- 点击「Install service」完成安装
- 打开管理员命令提示符,运行
- 管理服务:可以在「服务」管理器里启动/停止,或者用命令行:
nssm start DataValidationService、nssm stop DataValidationService
关键注意事项
- 绝对路径!绝对路径!绝对路径! 脚本里所有涉及文件的地方(读取数据源、写日志、依赖文件)都要用绝对路径,不然服务运行时会找不到文件。
- 加日志记录:一定要把脚本的运行情况、错误信息写到日志文件里,方便排查问题。推荐用Python的
logging模块,比如:
import logging from logging.handlers import RotatingFileHandler def setup_logger(): logger = logging.getLogger('validation_log') logger.setLevel(logging.INFO) # 日志文件最多存5个,每个10MB,自动切割 handler = RotatingFileHandler( 'C:\scripts\validation.log', maxBytes=10*1024*1024, backupCount=5, encoding='utf-8' ) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) return logger logger = setup_logger() # 然后在脚本里用: logger.info("数据校验开始执行") logger.error(f"校验出错:{str(e)}")
- 环境一致性:确保服务器的Python环境和你本地的一致,比如依赖库,你可以在本地运行
pip freeze > requirements.txt,然后在服务器上运行pip install -r requirements.txt安装所有依赖。 - 先测试再部署:先手动在服务器上跑一遍脚本,确认没有问题,再部署成服务或任务,避免一开始就出问题。
内容的提问来源于stack exchange,提问作者ilia rukhadze
相关产品推荐
相关产品推荐

