You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python SIGINT处理器在PM2进程监控中无法正常工作的问题

问题解决:PM2停止Python脚本时未触发SIGINT处理函数

原因分析

Windows系统的信号机制与Linux差异较大:

  • PM2在Windows下默认不会向子进程发送SIGINT,而是直接调用系统API终止进程
  • Python在Windows环境中对SIGTERM等信号的处理支持有限,且PM2默认停止时发送的信号可能无法被Python捕获

解决方案

1. 修改Python脚本,同时处理SIGINT和SIGTERM

PM2在Windows下停止进程时,更可能发送SIGTERM信号,因此需要给脚本添加该信号的处理逻辑:

import signal
import sys
import time

def signal_handler(sig, frame):
    if sig == signal.SIGINT:
        print('You pressed Ctrl+C!')
    elif sig == signal.SIGTERM:
        print('Received stop signal from PM2!')
    sys.exit(0)

# 绑定两种信号的处理函数
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)

print('Press Ctrl+C or run `pm2 stop SigTestApp` to exit')

while True:
    time.sleep(0.2)

2. 配置PM2发送指定停止信号并预留处理时间

创建PM2配置文件(如sigtest.config.js),明确指定停止信号为SIGINT,并设置超时时间确保脚本有足够时间处理:

module.exports = {
  apps: [{
    name: "SigTestApp",
    script: "py",
    args: "test.py",
    stop_signal: "SIGINT",
    kill_timeout: 1000 // 预留1秒处理时间
  }]
};

使用配置文件启动:

pm2 start sigtest.config.js

3. 验证输出

执行停止命令后,通过PM2日志查看输出:

pm2 logs SigTestApp

此时应该能看到脚本打印的停止提示信息。

内容的提问来源于stack exchange,提问作者Zain Ul Abidin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 05:01:26