PM2 Uygulaması Neden Sürekli Yeniden Başlıyor? Restart Sorunu ve Çözümleri
PM2 uygulamasının sürekli yeniden başlaması, uygulamanın çalıştıktan kısa süre sonra kapanması, hata vermesi veya PM2 tarafından belirlenen bir yeniden başlatma koşulunun tetiklenmesi nedeniyle oluşabilir. En sık nedenler uygulama hataları, eksik environment değişkenleri, veritabanı bağlantı sorunları, bellek problemleri, yanlış dosya yolu ve port çakışmalarıdır.
İlk kontrol edilmesi gereken yer:
pm2 statusardından:
pm2 logs uygulama-adiolmalıdır.
Sadece uygulamayı tekrar tekrar restart etmek yerine neden kapandığını bulmak gerekir.
PM2 restart sayısı nasıl kontrol edilir?
Çalışan uygulamaları görmek için:
pm2 statusveya:
pm2 listkullanabilirsiniz.
Listede
↺ veya restart sayısını gösteren ilgili sütun sürekli artıyorsa uygulama bir restart döngüsüne girmiş olabilir.Örneğin birkaç saniye içerisinde:
12 → 18 → 27 → 40şeklinde yükseliyorsa uygulamanın başlangıç sırasında hata verme ihtimali yüksektir.
İlk olarak PM2 loglarını kontrol edin
Belirli uygulamanın loglarını görmek için:
pm2 logs uygulama-adikullanabilirsiniz.
Tüm PM2 loglarını görmek için:
pm2 logskullanılabilir.
Burada:
- JavaScript exception
- Veritabanı bağlantı hatası
- Eksik modül
- Port çakışması
- Dosya bulunamadı
- Permission hatası
- Environment değişkeni problemi
gibi gerçek hata mesajını arayın.
Uygulama ayrıntıları nasıl görüntülenir?
PM2 uygulamasının ayrıntıları için:
pm2 describe uygulama-adikullanabilirsiniz.
Burada:
- Script yolu
- Çalışma dizini
- Restart sayısı
- Uptime
- Process ID
- Status
gibi bilgiler görülebilir.
Yanlış script veya çalışma dizini kullanılıyorsa problem burada fark edilebilir.
Port Already in Use hatası
Uygulamanız örneğin 3000 portunu kullanmaya çalışıyor ancak başka bir process aynı portu dinliyorsa uygulama kapanabilir.
Portu kontrol etmek için:
ss -lntp | grep ':3000'kullanılabilir.
Node.js tarafında:
EADDRINUSEbenzeri bir hata görülmesi portun kullanımda olduğuna işaret edebilir.
Bu durumda çalışan process'in ne olduğunu tespit etmeden rastgele sonlandırmayın.
Veritabanı bağlantısı başarısız olabilir
Node.js uygulamanız PostgreSQL gibi bir veritabanına ihtiyaç duyuyorsa bağlantı kurulamadığında başlangıç sırasında kapanabilir.
Örneğin:
- PostgreSQL durmuş olabilir.
-
DATABASE_URL yanlış olabilir.- Kullanıcı veya parola değişmiş olabilir.
- Veritabanı adı yanlış olabilir.
- Ağ bağlantısı başarısız olabilir.
PostgreSQL servisinin durumunu uygun sistemlerde:
systemctl status postgresqlile kontrol edebilirsiniz.
Ancak servisin çalışıyor olması uygulamanın doğru bağlantı bilgilerini kullandığını garanti etmez.
Environment değişkenlerini kontrol edin
Uygulamanızın ihtiyaç duyduğu:
-
PORT-
DATABASE_URL- API anahtarları
- Session secret
- Uygulama ortamı
gibi değişkenlerden biri eksikse uygulama başlangıç sırasında hata verebilir.
Özellikle uygulama terminalde manuel çalışırken düzgün, PM2 ile çalıştırıldığında hatalıysa environment farklarını araştırın.
PM2 ecosystem dosyası kullanılıyorsa yapılandırmayı kontrol edin.
Hassas değerleri loglarda veya herkese açık depolarda paylaşmayın.
Eksik Node.js paketi restart döngüsü oluşturabilir
Uygulama:
Cannot find modulebenzeri hata veriyorsa gerekli dependency eksik olabilir.
Projenin doğru dizininde:
npm installçalıştırılması gerekebilir.
Ancak production ortamında dependency değişikliklerini kontrollü yapmak gerekir.
package.json ve lock dosyasının proje sürümüyle uyumlu olduğundan emin olun.Yanlış Node.js sürümü kullanılabilir
Uygulama belirli bir Node.js sürümüne ihtiyaç duyuyorsa sunucudaki farklı sürüm başlangıç hatalarına neden olabilir.
Kontrol:
node -vve:
npm -vPM2'nin kullandığı Node.js ortamının terminalde kullandığınız ortamla aynı olup olmadığını da kontrol etmek gerekebilir.
Özellikle Node.js sürüm yöneticileri kullanılıyorsa bu ayrım önem kazanabilir.
Kod hatası uygulamayı kapatabilir
Uygulama başlangıcında yakalanmamış bir exception oluşuyorsa Node.js process'i kapanabilir.
PM2 process'in kapandığını gördüğünde yeniden başlatabilir.
Sonuç:
Başlat → hata → kapan → PM2 yeniden başlat → tekrar hata
şeklinde bir döngü oluşur.
Bu durumda PM2 sorunun kaynağı değildir; yalnızca kapanan uygulamayı yeniden çalıştırmaktadır.
Asıl hata uygulama loglarından bulunmalıdır.
Uygulamayı PM2 dışında çalıştırmak faydalı olabilir
Sorunu teşhis etmek için uygulamayı geçici olarak doğrudan çalıştırmak gerçek hata mesajını daha net gösterebilir.
Örneğin:
node app.jsveya projenize göre:
node server.jsAncak production uygulamasını durdurmadan önce bunun hizmet kesintisine neden olup olmayacağını değerlendirin.
Amaç PM2'yi kaldırmak değil, uygulamanın kendisinin başlatılabilir olup olmadığını test etmektir.
RAM yetersizliği restart sorununa neden olabilir
Sunucuda RAM tükeniyorsa uygulama sistem tarafından sonlandırılabilir.
Kontrol için:
free -hkullanabilirsiniz.
Process'leri görmek için:
topveya:
htopkullanılabilir.
Kernel'in Out Of Memory nedeniyle process sonlandırdığından şüpheleniyorsanız:
journalctl -k | grep -i -E 'out of memory|oom|killed process'ile ilgili kayıtları araştırabilirsiniz.
Memory leak olabilir mi?
Uygulamanın RAM kullanımı:
200 MB → 400 MB → 800 MB → 1.5 GBşeklinde sürekli artıyor ve restart sonrasında tekrar düşük seviyeden başlayıp aynı davranışı gösteriyorsa memory leak ihtimali araştırılabilir.
Ancak yüksek RAM kullanımı tek başına memory leak kanıtı değildir.
Uygulamanın gerçek iş yükü ve bellek davranışı analiz edilmelidir.
PM2 max memory restart ayarı olabilir
PM2 uygulamaları belirli bir bellek sınırına ulaştığında yeniden başlatılacak şekilde yapılandırılabilir.
Örneğin ecosystem yapılandırmasında
max_memory_restart benzeri bir ayar bulunabilir.Uygulama düzenli aralıklarla belirli bir RAM seviyesine ulaştığında restart oluyorsa bu yapılandırmayı kontrol edin.
Bu özellik faydalı bir koruma mekanizması olabilir ancak gerçek bir memory leak varsa yalnızca semptomu yönetir.
Watch modu restart oluşturabilir
PM2
watch özelliği aktifse proje dosyalarında değişiklik olduğunda uygulama yeniden başlatılabilir.Eğer uygulamanın kendisi:
- Log dosyası
- Cache
- Upload
- Geçici dosya
oluşturuyor ve bunlar watch kapsamındaysa beklenmeyen restart'lar meydana gelebilir.
PM2 yapılandırmasında
watch ve ignore_watch ayarlarını kontrol edin.Production ortamında gerçekten ihtiyaç yoksa watch özelliğini kullanmamak daha uygun olabilir.
Dosya izinleri sorun oluşturabilir
Uygulama başlangıç sırasında belirli bir:
- Dosyaya
- Upload klasörüne
- Log dizinine
- Config dosyasına
erişmeye çalışıyor ancak yetkisi bulunmuyorsa hata vererek kapanabilir.
Loglarda:
EACCESveya:
Permission deniedbenzeri mesajlar görülebilir.
Çözüm olarak her dosyaya geniş izinler vermek yerine uygulamanın gerçekten ihtiyaç duyduğu kullanıcı ve grup izinleri doğru şekilde yapılandırılmalıdır.
Disk tamamen dolu olabilir
Diskte alan kalmadığında uygulama:
- Log yazamayabilir.
- Geçici dosya oluşturamayabilir.
- Upload kaydedemeyebilir.
- Veritabanı işlemlerinde hata yaşayabilir.
Kontrol:
df -hInode kullanımı için:
df -ikullanılabilir.
Disk doluysa hangi dosyaların alan tükettiğini belirleyip kontrollü temizlik yapılmalıdır.
Uygulama başlangıçta başka servisi bekliyor olabilir
Node.js uygulaması:
- PostgreSQL
- Redis
- Harici API
- Başka bir backend
gibi servislere bağımlı olabilir.
Sunucu reboot olduğunda PM2 uygulaması bağımlı servis hazır olmadan başlayabilir.
Uygulama bağlantı hatasını yönetmeden kapanıyorsa restart döngüsü oluşabilir.
Bu durumda uygulamanın retry mekanizması ve servis başlangıç düzeni incelenmelidir.
PM2 restart sayısı neden eski olabilir?
PM2 üzerinde gördüğünüz restart sayısının yüksek olması uygulamanın şu anda sürekli çöktüğü anlamına gelmeyebilir.
Process uzun süredir çalışıyorsa geçmiş restart'lar birikmiş olabilir.
Bu nedenle:
- Restart sayısı
- Uptime
- Log zamanı
- Sayının şu anda artıp artmadığı
birlikte değerlendirilmelidir.
PM2 loglarının kendisi disk doldurabilir
Sürekli restart olan uygulama her başlangıçta aynı hatayı yazıyorsa PM2 logları hızla büyüyebilir.
Kontrol:
du -sh ~/.pm2/logsMevcut logları gerektiğinde boşaltmak için:
pm2 flushkullanılabilir.
Ancak önce önemli hata kayıtlarını inceleyin.
Kalıcı çözüm hatanın kendisini düzeltmek ve log rotation kullanmaktır.
Nginx 502 hatası PM2 restart sorunuyla ilişkili olabilir
Nginx reverse proxy arkasında çalışan Node.js uygulaması sürekli kapanıyorsa Nginx backend'e bağlanamadığı anlarda kullanıcılar:
502 Bad Gatewaygörebilir.
Bu durumda Nginx'i sürekli restart etmek yerine:
pm2 statusve:
pm2 logs uygulama-adikontrol edilmelidir.
Backend stabil hale geldiğinde 502 problemi de ortadan kalkabilir.
PM2'yi tamamen silip yeniden kurmak gerekir mi?
Çoğu restart probleminde hayır.
Sorun genellikle:
- Uygulama kodu
- Environment
- Port
- Veritabanı
- RAM
- Disk
- Dependency
- PM2 yapılandırması
ile ilgilidir.
PM2'yi yeniden kurmak gerçek nedeni çözmeyebilir.
Önce loglardan hata belirlenmelidir.
PM2 sürekli restart sorunu için hızlı kontrol sırası
Şu sırayla ilerleyebilirsiniz:
1.
pm2 status2. Restart sayısının gerçekten artıp artmadığını kontrol edin.
3.
pm2 logs uygulama-adi4.
pm2 describe uygulama-adi5. Portu
ss -lntp ile kontrol edin.6. Environment değişkenlerini kontrol edin.
7. Veritabanı ve diğer bağımlılıkları kontrol edin.
8.
free -h ile RAM durumuna bakın.9.
df -h ve df -i ile disk durumunu kontrol edin.10. OOM kayıtlarını araştırın.
11. Watch ve
max_memory_restart ayarlarını kontrol edin.12. Gerekirse uygulamayı PM2 dışında başlatıp gerçek hatayı inceleyin.
Sık yapılan hatalar
PM2 restart sorununda şu yaklaşımlardan kaçının:
- Sürekli
pm2 restart çalıştırmak- Loglara bakmadan PM2'yi yeniden kurmak
- Uygulama hatasını PM2 hatası sanmak
- Port çakışmasını kontrol etmemek
- Environment değişkenlerini unutmak
- Veritabanı bağlantısını kontrol etmemek
- RAM ve OOM durumunu gözden kaçırmak
- Disk doluluğunu kontrol etmemek
- Watch modunun gereksiz restart oluşturabileceğini unutmak
Özetle, PM2 uygulaması sürekli yeniden başlıyorsa yapılması gereken ilk işlem restart etmek değil, uygulamanın neden kapandığını bulmaktır.
En temel teşhis:
pm2 statuspm2 logs uygulama-adipm2 describe uygulama-adiile başlayabilir.
Ardından uygulama → port → environment → veritabanı → RAM → disk → PM2 yapılandırması sırasıyla kontrol edilerek restart döngüsünün gerçek nedeni bulunabilir.
