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
相关产品推荐
相关产品推荐

