|
|
@@ -6,10 +6,9 @@ import signal |
|
|
|
|
|
|
|
processes = [] |
|
|
|
|
|
|
|
|
|
|
|
def start_fastapi(): |
|
|
|
""" 启动 FastAPI 服务 """ |
|
|
|
environment = os.environ.get('environment', 'default') |
|
|
|
environment = os.environ.get('environment', 'default') |
|
|
|
if environment == 'default': |
|
|
|
process = subprocess.Popen(["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]) |
|
|
|
else: |
|
|
@@ -32,47 +31,44 @@ def start_celery_beat(): |
|
|
|
stdout=None, stderr=None) |
|
|
|
return process |
|
|
|
|
|
|
|
def signal_handler(sig, frame): |
|
|
|
"""处理退出信号,确保子进程也被终止""" |
|
|
|
print('正在关闭所有服务...') |
|
|
|
for process in processes: |
|
|
|
process.terminate() # 尝试优雅终止 |
|
|
|
# 给进程一点时间来优雅终止 |
|
|
|
time.sleep(2) |
|
|
|
# 检查是否有进程仍在运行,如果有则强制终止 |
|
|
|
for process in processes: |
|
|
|
if process.poll() is None: # 进程仍在运行 |
|
|
|
process.kill() # 强制终止 |
|
|
|
sys.exit(0) |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
|
# 启动 FastAPI、Celery Worker 和 Celery Beat |
|
|
|
fastapi_process = start_fastapi() |
|
|
|
# 注册信号处理程序 |
|
|
|
signal.signal(signal.SIGINT, signal_handler) # Ctrl+C |
|
|
|
signal.signal(signal.SIGTERM, signal_handler) # 终止信号 |
|
|
|
|
|
|
|
# 启动 Celery Worker 和 Celery Beat |
|
|
|
celery_worker_process = start_celery_worker() |
|
|
|
celery_beat_process = start_celery_beat() |
|
|
|
|
|
|
|
# 等待子进程完成 |
|
|
|
#fastapi_process.wait() |
|
|
|
celery_worker_process.wait() |
|
|
|
celery_beat_process.wait() |
|
|
|
# 将 Celery 进程添加到监控列表 |
|
|
|
processes.append(celery_worker_process) |
|
|
|
processes.append(celery_beat_process) |
|
|
|
|
|
|
|
# 启动并监控 FastAPI 进程 |
|
|
|
while True: |
|
|
|
fastapi_process = start_fastapi() |
|
|
|
processes.append(fastapi_process) |
|
|
|
print("FastAPI 服务已启动。") |
|
|
|
|
|
|
|
# 等待 FastAPI 进程结束 |
|
|
|
fastapi_process.wait() |
|
|
|
|
|
|
|
# def signal_handler(sig, frame): |
|
|
|
# """处理退出信号,确保子进程也被终止""" |
|
|
|
# print('正在关闭所有服务...') |
|
|
|
# for process in processes: |
|
|
|
# process.terminate() # 尝试优雅终止 |
|
|
|
|
|
|
|
# # 给进程一点时间来优雅终止 |
|
|
|
# time.sleep(2) |
|
|
|
|
|
|
|
# # 检查是否有进程仍在运行,如果有则强制终止 |
|
|
|
# for process in processes: |
|
|
|
# if process.poll() is None: # 进程仍在运行 |
|
|
|
# process.kill() # 强制终止 |
|
|
|
|
|
|
|
# sys.exit(0) |
|
|
|
# 如果 FastAPI 进程结束,移除它并记录日志 |
|
|
|
processes.remove(fastapi_process) |
|
|
|
print("FastAPI 服务意外终止,正在尝试重启...") |
|
|
|
|
|
|
|
# if __name__ == "__main__": |
|
|
|
# # 注册信号处理程序 |
|
|
|
# signal.signal(signal.SIGINT, signal_handler) # Ctrl+C |
|
|
|
# signal.signal(signal.SIGTERM, signal_handler) # 终止信号 |
|
|
|
|
|
|
|
# # 启动 FastAPI、Celery Worker 和 Celery Beat |
|
|
|
# #fastapi_process = start_fastapi() |
|
|
|
# celery_worker_process = start_celery_worker() |
|
|
|
# celery_beat_process = start_celery_beat() |
|
|
|
|
|
|
|
# # 让主进程保持运行,但不阻塞在特定子进程上 |
|
|
|
# try: |
|
|
|
# while True: |
|
|
|
# time.sleep(1) # 简单地循环等待,让信号处理程序有机会工作 |
|
|
|
# except KeyboardInterrupt: |
|
|
|
# pass # 如果收到 KeyboardInterrupt,信号处理程序会处理 |
|
|
|
# 等待一段时间再重启,避免频繁重启 |
|
|
|
time.sleep(5) |