restart_app.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. # 上传git仓库
  2. import os
  3. import sys
  4. import time
  5. import os
  6. import signal
  7. import subprocess
  8. import psutil
  9. from datetime import datetime
  10. # 配置部分
  11. APP_SCRIPT = 'web_app_2006.py'
  12. # 使用绝对路径指定pythonw.exe
  13. # 如果当前路径有问题,可手动修改为正确的pythonw.exe路径
  14. PYTHON_EXE = 'pythonw.exe'
  15. LOG_FILE = 'restart_app.log'
  16. WAIT_TIME_BEFORE_KILL = 1 # 进程终止前等待时间(秒)
  17. WAIT_TIME_AFTER_KILL = 1 # 进程终止后等待时间(秒)
  18. WAIT_TIME_BEFORE_RESTART = 1 # 重启前等待时间(秒)
  19. # 设置UTF-8编码
  20. os.environ['PYTHONIOENCODING'] = 'utf-8'
  21. # 日志函数
  22. def log(message):
  23. timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  24. log_message = f'[{timestamp}] {message}'
  25. print(log_message)
  26. with open(LOG_FILE, 'a', encoding='utf-8') as f:
  27. f.write(log_message + '\n')
  28. # 查找并终止相关进程
  29. def kill_processes():
  30. log(f'正在查找并终止 {APP_SCRIPT} 相关进程...')
  31. killed = False
  32. for proc in psutil.process_iter(['pid', 'name', 'cmdline']):
  33. try:
  34. if proc.name().lower() == 'python.exe' or proc.name().lower() == 'pythonw.exe':
  35. cmdline = proc.cmdline()
  36. if len(cmdline) >= 2 and APP_SCRIPT in cmdline[1]:
  37. log(f'找到进程: PID={proc.pid}, 命令行={cmdline}')
  38. proc.kill()
  39. killed = True
  40. except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess):
  41. pass
  42. return killed
  43. # 启动应用
  44. def start_application():
  45. log(f'正在启动 {APP_SCRIPT}...')
  46. try:
  47. # 获取当前脚本所在目录
  48. script_dir = os.path.dirname(os.path.abspath(__file__))
  49. # 构建启动命令
  50. cmd = [PYTHON_EXE, APP_SCRIPT]
  51. # 在后台启动进程
  52. # 使用pythonw.exe在后台运行,不显示控制台窗口
  53. # 设置进程创建标志,确保应用完全独立运行
  54. CREATE_NEW_PROCESS_GROUP = 0x00000200
  55. DETACHED_PROCESS = 0x00000008
  56. creationflags = CREATE_NEW_PROCESS_GROUP | DETACHED_PROCESS
  57. # 使用shell=True确保命令正确执行
  58. # 不捕获输出,因为pythonw.exe不会返回控制台输出
  59. try:
  60. subprocess.Popen(
  61. f'{PYTHON_EXE} {APP_SCRIPT}',
  62. cwd=script_dir,
  63. shell=True,
  64. creationflags=creationflags
  65. )
  66. log(f'{APP_SCRIPT} 启动成功')
  67. return True
  68. except Exception as e:
  69. log(f'启动 {APP_SCRIPT} 失败: {str(e)}')
  70. return False
  71. log(f'{APP_SCRIPT} 启动成功')
  72. return True
  73. except Exception as e:
  74. log(f'启动 {APP_SCRIPT} 失败: {str(e)}')
  75. return False
  76. # 主函数
  77. def main():
  78. log('===== 应用重启脚本开始执行 =====')
  79. log(f'等待 {WAIT_TIME_BEFORE_KILL} 秒确保response完成...')
  80. time.sleep(WAIT_TIME_BEFORE_KILL)
  81. # 终止现有进程
  82. killed = kill_processes()
  83. if killed:
  84. log(f'等待 {WAIT_TIME_AFTER_KILL} 秒确保进程完全终止...')
  85. time.sleep(WAIT_TIME_AFTER_KILL)
  86. else:
  87. log('未找到需要终止的进程')
  88. # 启动新进程
  89. start_application()
  90. log(f'等待 {WAIT_TIME_BEFORE_RESTART} 秒后脚本将退出...')
  91. time.sleep(WAIT_TIME_BEFORE_RESTART)
  92. log('===== 应用重启脚本执行完毕 =====')
  93. if __name__ == '__main__':
  94. main()