|
|
@@ -0,0 +1,107 @@
|
|
|
+import os
|
|
|
+import sys
|
|
|
+import time
|
|
|
+import os
|
|
|
+import signal
|
|
|
+import subprocess
|
|
|
+import psutil
|
|
|
+from datetime import datetime
|
|
|
+
|
|
|
+# 配置部分
|
|
|
+APP_SCRIPT = 'web_app_2006.py'
|
|
|
+# 使用绝对路径指定pythonw.exe
|
|
|
+# 如果当前路径有问题,可手动修改为正确的pythonw.exe路径
|
|
|
+PYTHON_EXE = 'pythonw.exe'
|
|
|
+LOG_FILE = 'restart_app.log'
|
|
|
+WAIT_TIME_BEFORE_KILL = 1 # 进程终止前等待时间(秒)
|
|
|
+WAIT_TIME_AFTER_KILL = 1 # 进程终止后等待时间(秒)
|
|
|
+WAIT_TIME_BEFORE_RESTART = 1 # 重启前等待时间(秒)
|
|
|
+
|
|
|
+# 设置UTF-8编码
|
|
|
+os.environ['PYTHONIOENCODING'] = 'utf-8'
|
|
|
+
|
|
|
+# 日志函数
|
|
|
+def log(message):
|
|
|
+ timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ log_message = f'[{timestamp}] {message}'
|
|
|
+ print(log_message)
|
|
|
+ with open(LOG_FILE, 'a', encoding='utf-8') as f:
|
|
|
+ f.write(log_message + '\n')
|
|
|
+
|
|
|
+# 查找并终止相关进程
|
|
|
+def kill_processes():
|
|
|
+ log(f'正在查找并终止 {APP_SCRIPT} 相关进程...')
|
|
|
+ killed = False
|
|
|
+ for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
|
|
|
+ try:
|
|
|
+ if proc.name().lower() == 'python.exe' or proc.name().lower() == 'pythonw.exe':
|
|
|
+ cmdline = proc.cmdline()
|
|
|
+ if len(cmdline) >= 2 and APP_SCRIPT in cmdline[1]:
|
|
|
+ log(f'找到进程: PID={proc.pid}, 命令行={cmdline}')
|
|
|
+ proc.kill()
|
|
|
+ killed = True
|
|
|
+ except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
|
|
|
+ pass
|
|
|
+ return killed
|
|
|
+
|
|
|
+# 启动应用
|
|
|
+def start_application():
|
|
|
+ log(f'正在启动 {APP_SCRIPT}...')
|
|
|
+ try:
|
|
|
+ # 获取当前脚本所在目录
|
|
|
+ script_dir = os.path.dirname(os.path.abspath(__file__))
|
|
|
+ # 构建启动命令
|
|
|
+ cmd = [PYTHON_EXE, APP_SCRIPT]
|
|
|
+ # 在后台启动进程
|
|
|
+ # 使用pythonw.exe在后台运行,不显示控制台窗口
|
|
|
+ # 设置进程创建标志,确保应用完全独立运行
|
|
|
+ CREATE_NEW_PROCESS_GROUP = 0x00000200
|
|
|
+ DETACHED_PROCESS = 0x00000008
|
|
|
+ creationflags = CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
|
|
|
+
|
|
|
+ # 使用shell=True确保命令正确执行
|
|
|
+ # 不捕获输出,因为pythonw.exe不会返回控制台输出
|
|
|
+ try:
|
|
|
+ subprocess.Popen(
|
|
|
+ f'{PYTHON_EXE} {APP_SCRIPT}',
|
|
|
+ cwd=script_dir,
|
|
|
+ shell=True,
|
|
|
+ creationflags=creationflags
|
|
|
+ )
|
|
|
+ log(f'{APP_SCRIPT} 启动成功')
|
|
|
+ return True
|
|
|
+ except Exception as e:
|
|
|
+ log(f'启动 {APP_SCRIPT} 失败: {str(e)}')
|
|
|
+ return False
|
|
|
+
|
|
|
+ log(f'{APP_SCRIPT} 启动成功')
|
|
|
+ return True
|
|
|
+ except Exception as e:
|
|
|
+ log(f'启动 {APP_SCRIPT} 失败: {str(e)}')
|
|
|
+ return False
|
|
|
+
|
|
|
+# 主函数
|
|
|
+def main():
|
|
|
+ log('===== 应用重启脚本开始执行 =====')
|
|
|
+
|
|
|
+ log(f'等待 {WAIT_TIME_BEFORE_KILL} 秒确保response完成...')
|
|
|
+ time.sleep(WAIT_TIME_BEFORE_KILL)
|
|
|
+ # 终止现有进程
|
|
|
+ killed = kill_processes()
|
|
|
+ if killed:
|
|
|
+ log(f'等待 {WAIT_TIME_AFTER_KILL} 秒确保进程完全终止...')
|
|
|
+ time.sleep(WAIT_TIME_AFTER_KILL)
|
|
|
+ else:
|
|
|
+ log('未找到需要终止的进程')
|
|
|
+
|
|
|
+ # 启动新进程
|
|
|
+ start_application()
|
|
|
+
|
|
|
+ log(f'等待 {WAIT_TIME_BEFORE_RESTART} 秒后脚本将退出...')
|
|
|
+ time.sleep(WAIT_TIME_BEFORE_RESTART)
|
|
|
+ log('===== 应用重启脚本执行完毕 =====')
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|
|
|
+
|
|
|
+
|