设置系统服务将应用配置为 Windows 服务实现开机自启动。
This commit is contained in:
115
flask_prompt_master_service.py
Normal file
115
flask_prompt_master_service.py
Normal file
@@ -0,0 +1,115 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Flask 提示词大师 Windows 服务
|
||||
用于将应用注册为 Windows 系统服务,实现开机自启动
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import logging
|
||||
import win32serviceutil
|
||||
import win32service
|
||||
import win32event
|
||||
import servicemanager
|
||||
import socket
|
||||
from pathlib import Path
|
||||
|
||||
# 添加项目路径到 Python 路径
|
||||
project_root = Path(__file__).parent
|
||||
sys.path.insert(0, str(project_root))
|
||||
|
||||
from src.flask_prompt_master import create_app
|
||||
|
||||
class FlaskPromptMasterService(win32serviceutil.ServiceFramework):
|
||||
"""Flask 提示词大师 Windows 服务类"""
|
||||
|
||||
_svc_name_ = "FlaskPromptMaster"
|
||||
_svc_display_name_ = "Flask 提示词大师服务"
|
||||
_svc_description_ = "Flask 提示词大师 Web 应用服务,提供提示词生成功能"
|
||||
|
||||
def __init__(self, args):
|
||||
win32serviceutil.ServiceFramework.__init__(self, args)
|
||||
self.stop_event = win32event.CreateEvent(None, 0, 0, None)
|
||||
self.app = None
|
||||
self.server = None
|
||||
|
||||
# 配置日志
|
||||
self.setup_logging()
|
||||
|
||||
def setup_logging(self):
|
||||
"""配置服务日志"""
|
||||
log_dir = project_root / "logs"
|
||||
log_dir.mkdir(exist_ok=True)
|
||||
|
||||
logging.basicConfig(
|
||||
level=logging.INFO,
|
||||
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
|
||||
handlers=[
|
||||
logging.FileHandler(log_dir / "service.log", encoding='utf-8'),
|
||||
logging.StreamHandler()
|
||||
]
|
||||
)
|
||||
self.logger = logging.getLogger(__name__)
|
||||
|
||||
def SvcStop(self):
|
||||
"""停止服务"""
|
||||
self.logger.info("正在停止 Flask 提示词大师服务...")
|
||||
self.ReportServiceStatus(win32service.SERVICE_STOP_PENDING)
|
||||
win32event.SetEvent(self.stop_event)
|
||||
|
||||
if self.server:
|
||||
self.server.shutdown()
|
||||
|
||||
def SvcDoRun(self):
|
||||
"""运行服务"""
|
||||
try:
|
||||
self.logger.info("正在启动 Flask 提示词大师服务...")
|
||||
|
||||
# 设置环境变量
|
||||
os.environ['FLASK_ENV'] = 'production'
|
||||
os.environ['PYTHONPATH'] = str(project_root)
|
||||
|
||||
# 创建应用实例
|
||||
self.app = create_app()
|
||||
|
||||
# 启动服务器
|
||||
self.logger.info("服务启动成功,监听端口 5000")
|
||||
self.app.run(
|
||||
host='0.0.0.0',
|
||||
port=5000,
|
||||
debug=False,
|
||||
threaded=True,
|
||||
use_reloader=False
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"服务启动失败: {e}")
|
||||
raise
|
||||
|
||||
def log_service_status(self):
|
||||
"""记录服务状态"""
|
||||
try:
|
||||
# 测试健康检查
|
||||
import requests
|
||||
response = requests.get('http://localhost:5000/health', timeout=5)
|
||||
if response.status_code == 200:
|
||||
self.logger.info("服务运行正常")
|
||||
else:
|
||||
self.logger.warning(f"健康检查失败: {response.status_code}")
|
||||
except Exception as e:
|
||||
self.logger.error(f"健康检查异常: {e}")
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
if len(sys.argv) == 1:
|
||||
# 作为服务运行
|
||||
servicemanager.Initialize()
|
||||
servicemanager.PrepareToHostSingle(FlaskPromptMasterService)
|
||||
servicemanager.StartServiceCtrlDispatcher()
|
||||
else:
|
||||
# 命令行操作
|
||||
win32serviceutil.HandleCommandLine(FlaskPromptMasterService)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user