Windows sunucuda Node.js ya da Python uygulamasını servis olarak çalıştırma (NSSM)
Bir uygulamayı Windows'ta komut penceresinden çalıştırırsanız, pencereyi kapattığınızda ya da oturumu kapattığınızda durur. Sunucu yeniden başlayınca da kendiliğinden açılmaz. Gerçek bir çözüm, uygulamayı bir Windows servisi yapmaktır: servisler oturum açmadan çalışır, sunucu açılışında başlar ve çökerse otomatik yeniden başlatılabilir. Normal programları servis yapmanın en kolay yolu NSSM (Non-Sucking Service Manager) adlı ücretsiz küçük araçtır.
NSSM'i alın
NSSM'in kendi sitesinden indirdiğiniz zip dosyasını çıkarın ve 64 bit sürümdeki nssm.exe dosyasını sabit bir klasöre (örneğin C:\araclar\nssm.exe) koyun. Programı güvenilir kaynaktan indirdiğinizden emin olun.
Servis oluşturma
Yönetici Komut İstemi'nde (arayüz için nssm install yazmanız yeter):
C:\araclar\nssm.exe install BotServisi "C:\Program Files\nodejs\node.exe" "C:\botlar\bot\index.js"
C:\araclar\nssm.exe set BotServisi AppDirectory "C:\botlar\bot"
C:\araclar\nssm.exe set BotServisi Start SERVICE_AUTO_START
C:\araclar\nssm.exe start BotServisi
İlk satırda servis adı, çalıştırılacak program (Node.js) ve argümanı (betiğiniz) bulunur. Python için program yolunu python.exe'ye, argüman olarak .py dosyasına verin; sanal ortam kullanıyorsanız ortamın içindeki python.exe'yi gösterin. AppDirectory çalışma klasörünü belirler; göreli yollar buradan çözülür. Birçok hatanın nedeni bu ayarın verilmemesidir.
Günlük ve yeniden başlatma ayarları
C:\araclar\nssm.exe set BotServisi AppStdout "C:\botlar\gunluk.txt"
C:\araclar\nssm.exe set BotServisi AppStderr "C:\botlar\hata.txt"
C:\araclar\nssm.exe set BotServisi AppRotateFiles 1
C:\araclar\nssm.exe set BotServisi AppExit Default Restart
C:\araclar\nssm.exe set BotServisi AppRestartDelay 5000
Uygulamanın yazdıkları dosyalara gider (günlük döndürme açık), uygulama çökerse 5 saniye sonra yeniden başlatılır. Çökme döngüsüne girerse günlüğe bakın.
Yönetim
nssm status BotServisi
nssm restart BotServisi
nssm stop BotServisi
nssm remove BotServisi confirm
Windows'un kendi Hizmetler uygulamasından (services.msc) de servisi görüp durdurabilirsiniz. Güncelleme yaparken önce nssm stop ile durdurun, dosyaları değiştirin, sonra başlatın.
Sık sorunlar
- Servis başlıyor ama hemen duruyor:
hata.txt'ye bakın. Genellikle yanlış yol, eksik ortam değişkeni (PATHservisin hesabında farklıdır) ya da gerekli bir klasörün olmamasıdır.nssm set BotServisi AppEnvironmentExtra ANAHTAR=değerile ortam değişkeni ekleyin. Tam yol kullanın. - Dosya izinleri: Servis varsayılan olarak
LocalSystemhesabıyla çalışır. Ağ paylaşımı kullanacaksa farklı bir hesap gerekebilir (nssm set BotServisi ObjectName hesap parola). - Pencereli program: Servisler ekran göstermez. Grafik arayüz gerektiren program servis olarak çalışmaz; Görev Zamanlayıcı ile oturum açılışında çalıştırın: Görev Zamanlayıcı.
- Port erişimi: Uygulama bir portu dinliyorsa güvenlik duvarında açın: port açma.
Linux'taki karşılığı systemd servisidir: arka planda çalıştırma. Discord botu gibi hafif işler için hazır bir çözüm istiyorsanız Bot ve Uygulama Hosting bu işi sizin yerinize halleder.
Sık sorulanlar
NSSM yerine ne kullanabilirim?
Windows'un kendi sc create komutu yalnızca gerçek servis olarak yazılmış programlarla çalışır; sıradan uygulamalar için NSSM gerekir. Alternatif olarak Görev Zamanlayıcı (oturumsuz) çalışır ama yeniden başlatma yönetimi zayıftır.
Servis çalışıyor ama bot Discord'da çevrimdışı.
Günlüğe bakın: genellikle token ortam değişkeni servise iletilmemiştir. AppEnvironmentExtra ile ekleyin: token güvenliği.
Güncelleme yaptıktan sonra eski sürüm çalışıyor.
Servisi durdurmadan dosyaları değiştirdiyseniz süreç eski kodu bellekte tutuyordur. nssm restart ile yeniden başlatın.
İlgili makaleler
- Windows sunucuda program kurma ve 7/24 çalıştırma
- Windows Görev Zamanlayıcı ile program ve betik çalıştırma (açılışta, saatlik)
- Node.js veya Python uygulamamı sunucuda nasıl yayınlarım?
Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.
Geri bildiriminiz için teşekkürler!