Python服务在CentOS上运行一段时间后报“服务不存在,请重试”,但pm2显示服务仍为online且无错误日志,有大大遇到过这个问题吗?
Python服务在CentOS上运行一段时间后报“服务不存在,请重试”,但pm2显示服务仍为online且无错误日志,有大大遇到过这个问题吗?
python 什么服务,进程还在吗?
这个问题我遇到过,典型的进程假死。pm2显示online是因为进程ID还在,但实际服务已经无法响应了。
根本原因是Python进程内部出现了未捕获的异常或资源耗尽(比如内存泄漏),导致进程虽然存在但已经失去功能。pm2默认只监控进程是否存在,不检查服务健康状态。
给你两个解决方案:
方案一:增加健康检查(推荐) 在Flask/FastAPI应用中添加健康检查端点,然后配置pm2定期检查:
# app.py
from flask import Flask
import psutil
app = Flask(__name__)
@app.route('/health')
def health_check():
"""健康检查端点"""
try:
# 检查内存使用(示例)
process = psutil.Process()
mem_info = process.memory_info()
if mem_info.rss > 500 * 1024 * 1024: # 超过500MB
return {'status': 'error', 'memory': 'high'}, 500
return {'status': 'healthy', 'pid': process.pid}, 200
except Exception as e:
return {'status': 'error', 'error': str(e)}, 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
然后配置pm2:
# ecosystem.config.js
module.exports = {
apps: [{
name: 'python-app',
script: 'app.py',
interpreter: 'python3',
max_memory_restart: '500M', # 内存超过500M自动重启
watch: false,
env: {
'PYTHONUNBUFFERED': '1'
},
// 关键:添加健康检查
healthcheck: {
url: 'http://localhost:5000/health',
interval: 30000, # 每30秒检查一次
timeout: 5000
}
}]
}
方案二:使用进程监控脚本 如果不想改代码,写个监控脚本:
# monitor.py
import requests
import subprocess
import time
import sys
def check_service():
try:
resp = requests.get('http://localhost:5000/', timeout=5)
return resp.status_code == 200
except:
return False
def restart_service():
subprocess.run(['pm2', 'restart', 'python-app'])
if __name__ == '__main__':
while True:
if not check_service():
print(f"[{time.ctime()}] 服务无响应,重启中...")
restart_service()
time.sleep(60)
用pm2启动监控脚本:
pm2 start monitor.py --name "monitor" --interpreter python3
快速排查命令:
# 1. 检查实际进程状态
ps aux | grep python
# 2. 查看进程打开的文件(看是否卡住)
lsof -p <PID>
# 3. 检查系统日志
journalctl -u pm2-<your-service> --since "1 hour ago"
# 4. 查看内存使用
pm2 monit
总结建议:给服务加个健康检查端点最靠谱。
pm2 的问题?以前用 pm2 管理 node 也碰到过类似的问题
python 怎么用 pm2 跑起来的? runserver ?
是呀,请问是什么问题
你是怎么解决的
死掉的时候忘了看 python 进程了,但是 pm2 显示的是 online 就没去看了
“服务器不存在”是谁报的?
同楼上 “服务器不存在”是谁报的?
进程还活着吗?
有点怀疑要么进程没了, 要么进程堵了, 线索太少了也
问的是 who,不是 when
换成 supervisor
我查看了一下,python 进程还在的,只是 sleep 了,是这个函数 sk_wait_data 导致他睡眠的,好像是 socket 链接导致的,有遇到过的吗
我查看了一下,python 进程还在的,只是 sleep 了,是这个函数 sk_wait_data 导致他睡眠的,好像是 socket 导致的,有遇到过的吗
你是不是自己写的网络通信部分,没有用成熟的库啊?
用的别人的库 ya
pm2 管理 python 进程很方便的,自动解决端口占用问题。
是哪边请求阻死了吧 ,你要检查代码里所有长短连接的地方,尤其是 http 请求有没有设置超时时间
设置了 15 秒的超时时间了

