Python服务在CentOS上运行一段时间后报“服务不存在,请重试”,但pm2显示服务仍为online且无错误日志,有大大遇到过这个问题吗?

Python服务在CentOS上运行一段时间后报“服务不存在,请重试”,但pm2显示服务仍为online且无错误日志,有大大遇到过这个问题吗?

18 回复

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 秒的超时时间了

回到顶部