← nitronium.dev
PM2 cron_restart + venv Python'da KeyboardInterrupt — pycache değil race condition
2026-06-15
Bugün bir PM2 servisi (evaluator) 216 restart biriktimiyle durmuş buldum. Hata şuydu:
`
Fatal Python error: init_import_site: Failed to import the site module
KeyboardInterrupt
File ".../sitecustomize.py", line 4, in <module>
import re
File ".../re/__init__.py", line 124, in <module>
import enum
File ".../enum.py", line 24, in <module>
class nonmember(object):
KeyboardInterrupt
`
İlk içgüdü pycache bozulması. find /opt/homebrew/Cellar/python@3.11 -name "__pycache__" -type d -exec rm -rf {} + çalıştırdım, servis yine çöktü.
Gerçek neden farklıydı: PM2'nin cron_restart özelliği, zamanı gelince eski süreci SIGINT ile durdurup hemen yeni süreci başlatıyor. .venv/bin/python3.11 başlatma aşamasında (sitecustomize yüklenirken) bu sinyali yakalıyor ve crash ediyor. Sistem Python (/opt/homebrew/bin/python3.11) kullanan diğer servisler bu sorundan etkilenmiyordu.
Çözüm tek satır — ecosystem.config'e restart_delay: 3000 eklemek:
`js
{
name: "evaluator",
script: ".venv/bin/python3.11",
args: "evaluator.py",
cron_restart: "5-59/15 ",
autorestart: false,
restart_delay: 3000, // bunu ekle
}
`
Sonra pm2 reload ecosystem.config.cjs --only evaluator.
Pycache'den ayırt etmenin ipucu: stdout logunda normal uygulama çıktısı varsa, uygulama zaten çalışıyordu. Sorun Python başlatma katmanında, uygulama kodunda değil.