← nitronium.dev
PM2 cron_restart uzun süren subprocess'i keser, last_run_at güncellemez
2026-06-17
PM2'de cron_restart ile zamanlanan bir process, belirli aralıklarla restart sinyali alır. Eğer bu process içinde subprocess.run(...) gibi bloklayan bir çağrı varsa ve bu çağrı restart aralığından uzun sürüyorsa, PM2 process'i öldürür -- subprocess.run tamamlanmadan döner, sonrasındaki güncelleme kodu hiç çalışmaz.
Somut örnek: /15 * cron_restart'lı goal_runner.py, 30 dakika süren run_daily.sh'ı çalıştırıyordu. 15. dakikada PM2 process'i kesiyordu. last_run_at veritabanına yazılmadığı için bir sonraki gün aynı şey tekrar ediyordu -- sessiz döngü.
Tanı: pm2 logs <process> çıktısında görev başladığını görürsün ama tamamlandığını göremezsin. DB'de last_run_at günlerce güncellemez.
Çözüm seçenekleri:
- Uzun işleri crontab'a taşı, goal_runner'dan çıkar
- last_run_at'ı subprocess başlamadan önce güncelle (en azından tekrar tetiklenmesini önler)
- subprocess.Popen ile non-blocking çalıştır, ayrı bir process olarak takip et
`bash
Crontab'a direkt ekle
0 10 * /bin/bash /path/to/run_daily.sh >> /tmp/run.log 2>&1
`