Bir node.js uygulaması kalıcı olarak nasıl çalıştırılır?


259

Bir Debian sunucusunda Node.js yükledim. Bu komut satırı ile macun bir uygulama başlatmak nasıl anlıyorum:

node /srv/www/MyUserAccount/server/server.js

ve adrese 50.51.52.53:8080(IP ve bağlantı noktası) ulaşın .

Ama macunu kapatır kapatmaz adrese 50.51.52.53:8080artık ulaşamıyorum .

Bir Node.js uygulaması kalıcı olarak nasıl çalışır?

Tahmin edebileceğiniz gibi, ben Linux ve Node.js ile yeni başlayan biriyim.


7
Forever'ın herhangi bir nedenle kullanılmasını istemiyorsanız , pm2'nin Forever için iyi bir alternatif olduğunu unutmayın.
Kevin B

teşekkürler @KevinB github.com/Unitech/pm2 gerçekten iyi bir alternatif
Sachin

Yanıtlar:


221

Diğer cevaplar OP'nin problemini çözse de, hepsi aşırı kilolu ve neden bu sorunu yaşadığını açıklamıyor.

Anahtar bu çizgi, "Macunu kapatıyorum, sonra adrese ulaşamıyorum"

Putty'de uzak ana makinenize giriş yaptığınızda, bir SSH linux işlemi başlattınız ve bu SSH oturumundan yazılan tüm komutlar, söz konusu işlemin alt öğeleri olarak yürütülecektir.

Sorununuz, Putty'yi kapattığınızda, bu işlemi ve tüm etkin alt işlemleri öldüren SSH oturumundan çıkmanızdır. Macunu kapattığınızda sunucunuzu yanlışlıkla ön planda çalıştırdığınız için öldürürsünüz . Bu davranışı önlemek için, komutunuza & komutunu ekleyerek sunucuyu arka planda çalıştırın :

node /srv/www/MyUserAccount/server/server.js &

Buradaki sorun linux bilgisi eksikliği ve düğüm hakkında bir soru değil. Daha fazla bilgi için: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

GÜNCELLEME:

Diğerlerinin de belirttiği gibi, düğüm sunucusu terminalden çıkarken yine de ölebilir. Karşılaştığım ortak bir sorun, düğüm işlemi bg'de çalışsa bile, stdout ve stderr hala terminalde işaret ediliyor. Bu, düğüm sunucusu console.log veya console.error dosyasına yazarsa, bozuk bir boru hatası ve çökme alacağı anlamına gelir. Bu işleminizin çıktısını pipete ederek önlenebilir:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Sorun devam ederse , tmux veya nohup gibi düğüme özgü çözümlerden daha sağlam olan şeylere bakmalısınız , çünkü her türlü işlemi (veritabanları, günlük hizmetleri, diğer diller) çalıştırmak için kullanılabilirler.

Sunucunun çıkmasına neden olabilecek yaygın bir hata, çalıştırdıktan sonra nohup node your_path/server.js &basit bir tıklama ile Putty terminalini kapatmanızdır. Bunun exityerine komutu kullanmalısınız, o zaman düğüm sunucunuz çalışır durumda olacaktır.


7
Eğer &servis yaparken Putty Seans hala kapatırsanız yine de kapanır. (Debian
Jesse'de

1
@NiCkNewman'ın dediği gibi, bu cevap eksik! Doğru çözüm için Rick Roy'un cevabına bakınız .
thejonwithnoh

19
"&" İşlemi arka planda çalıştırır, ancak aslında konsolun penceresinden ayırmak için bu komutun başlangıcına "nohup" eklemeniz gerekir, böylece uygulama birkaç saniye sonra uykuya daldığında uygulama durmaz saat, önceden belirtilen komutu şu şekilde değiştirerek:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
AIX powersystem, nohup node myApp.js &uygulamayı bg'de çalıştırdı, ancak terim kapatıldığında ölüyor. Neden olsa emin değilim.
AnBisw

4
@Annjawn, exitterminalden çıkmak için komut kullanmanız gerekir .
Ionut Necula

342

Sen yükleyebilir sonsuza böyle UÖM'yi kullanarak:

sudo npm install -g forever

Ve sonra başvurunuzu şu şekilde başlatın:

forever server.js

Veya bir hizmet olarak:

forever start server.js

Bir nedenden dolayı çöktüğünde veya durduğunda uygulamanızı sonsuza dek yeniden başlatır. Yeniden başlatmaları 5 ile sınırlamak için şunları kullanabilirsiniz:

forever -m5 server.js

Çalışan tüm işlemleri listelemek için:

forever list

Parantez içindeki tamsayıyı not edin ve bir işlemi durdurmak için aşağıdaki gibi kullanın:

forever stop 0

Çalışan bir işlemi yeniden başlatmak:

forever restart 0

Uygulama dosyanız üzerinde çalışıyorsanız, dosyanız -wher server.jsdeğiştiğinde otomatik olarak yeniden başlatmak için parametreyi kullanabilirsiniz :

forever -w server.js

11
@MarthaJames, ssh oturumunuz / pencereniz kapandığında kapanıyorsa, muhtemelen "start" ı dahil etmeyi unuttunuzforever start <file>
Kristian

8
Kullanmak arasındaki fark nedir forever server.jsve forever start server.js? Bunun "hizmet olarak" yazdığını biliyorum ama bu ne anlama geliyor?
Marquizzo

5
Ben yazarken forever server.js, bu sunucuyu başlatır. Ctrl+ Tuşuna Cbasarsam servis durur. Ben yazarsanız forever start server.jso zaman hizmeti başlar ve hatta basın eğer Ctrl+ Caçık kalır. Daha sonra listeyi durdurmak / bakmak için yukarıda atıfta bulunulan diğer komutları yapabilirsiniz. En azından ben de öyle yaşadım.
Termato

6
Bu, sunucu yeniden başlatıldıktan sonra komut dosyasını başlatır mı?
beingalex

1
foreverModülü (v0.15.3) Servis saldırıların Normal İfade Reddi karşı savunmasızdır ve kullanılmamalıdır: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

Sen kullanabilirsiniz PM2 , bu yerleşik bir yük dengeleyici node.js uygulamalar için bir üretim prosesi yönetici.

PM2'yi yükle

$ npm install pm2 -g

Bir uygulama başlatın

$ pm2 start app.js

Express kullanıyorsanız, uygulamanızı aşağıdaki gibi başlatabilirsiniz:

pm2 start ./bin/www --name="app"

Çalışan tüm işlemleri listeleme:

$ pm2 list

Tüm işlemleri listeleyecektir. Daha sonra aşağıdaki komutla uygulamanın kimliğini veya adını kullanarak hizmetinizi durdurabilir / yeniden başlatabilirsiniz.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Günlükleri görüntülemek için

$ pm2 logs ['all'|app_name|app_id]

1
Tanrı seni korusun! işe yarıyor!! Forever ve Nohup, Amazon web hizmeti bitnami nodejs sunucusunda ( docs.bitnami.com/aws/infrastructure/nodejs ) çalışmaz . PM2 harika çalışıyor!
polras

Bu kütüphane
github'da

41

Bir çökme durumunda Düğüm'ü yeniden başlatmak için Forever gibi bir şey aramanızı ve bunu sizin için arka plana almayı öneririm.


Ben olmadan işaret etmek istiyorum nohup(eğer tmux için ekran gibi bir şey kullanmıyorsanız) Eğer bu şekilde çalıştırmak eğer ssh oturumu çıktığınızda, düğüm çıkılacak.
Haozhun

1
@Haozhun, İlginç, ancak makinelerimde benim için böyle çalışmıyordu. Bu komutu kullanarak ssh yaptığımda ve bir şey başlattığımda, SSH oturumunu kapattıktan sonra bile arka planda sonsuza kadar çalışır.
Brad

@Brad Lütfen stackoverflow.com/questions/4018154/… adresindeki 2. cevaba bakın . Görünüşe göre bazı insanlar açıklayan bu sorunun ilk yorumuna katılıyor nohup. Bu karışıklığı çözebilirsek harika olur. Ama nereden başlayacağımı bilmiyorum.
Haozhun

4
Çoğu unixen için (Linux dağıtımlarının çoğu dahil), terminal penceresini kapatırsanız arka planda bir şeyler çalıştırmak işlemi yine de öldürür. Bunu önlemek için ile çalıştırın nohup. Örnek:nohup node app.js &
slebetman

1
Forever'ı Linux env üretimi ile kullanıyorum. Genellikle start --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Düğüm uygulamanızı her zaman terminalde çalıştırmak istiyorsanız, sadece ekranı kullanın.

Ubuntu / debian'a yükle:

sudo apt-get install screen

Kullanımı:

$ screen
$ node /path/to/app.js

ctrl + ave sonra ctrl + dreddetmek

Geri almak için:

Bir ekran: screen -r

Birden fazla ekran varsa, tüm ekranları listeleyebilirsiniz: screen -ls

Ve sonra: screen -r pid_number


1
Bu, aynı zamanda süreci herhangi bir zamanda ön plana
geçirmeme

26

Bunu sadece kullanabilirsiniz

nohup node /srv/www/MyUserAccount/server/server.js &

Bu uygulamayı çalıştıracak ve kapatmak için onu öldürmek zorunda kalacak.

Bunun htopiçin düğümü kurup arayabilir ve sonra öldürebilirsiniz.


18
Bu durumda, kullanıcının PuTTY oturumundan düzgün bir şekilde çıkması gerektiğini (yani exitkomut aracılığıyla ) not etmek önemlidir . Kullanıcı sadece pencereyi kapatırsa, bu işlemi SIGHUPsonlandırmak dışında bir sinyal kullanabilir ve bu nedenle düğüm yine de kapanacaktır.
thejonwithnoh

1
Soruna basit bir çok amaçlı Linux çözümü olduğu için +1. Bu DogNibbler'in cevabından daha iyidir .
thejonwithnoh

@ thejonwithnoh yorumunuzu okuduktan sonra aniden kapanış macun ile denedim ama sunucu hala çalıştı, belki env nasıl yapılandırılmış ile ilgisi vardı. Ama OP'nin bunu sormasının ne olduğunu anlamanın en basit yolu olacağını düşündüm
Rick Roy

Bu basit yaklaşımı seviyorum, onu kullandığım, onu öldürmek için, en kolayı sadece killall node, tüm düğüm süreçlerini öldürecek olan, benim durumumda sadece bir tanesidir.
Nelson

@Nelson Tüm düğüm süreçlerini öldürür ve çalışan birden fazla komut dosyanız varsa ve yalnızca belirli bir sonlandırmayı sonlandırmak istiyorsanız, işlemi bir üretim sunucusunda çalışan birden fazla düğüm işlemi olması durumunda işlemi bulmanızı ve sonra belirli bir sonlandırmayı öneririm. ve kabus gibi hissetmek istemiyorum: D
Rick Roy

12

Forever tam olarak bunu yapmak için çok iyi bir NodeJs modülüdür.

foreverKomut satırına yazarak yükleme

$ npm install forever -g

Sonra bir node.js komut dosyasını çalıştırmak için aşağıdaki komutu kullanın

$ forever start /path/to/script.js

Senin gitmen iyidir. Ayrıca çalıştırabilirsiniz

$ forever list

çalışan tüm komut dosyalarını görmek için. Herhangi bir komut dosyasını yazarak sonlandırabilirsiniz

$ forever stop [pid]

komuttan [pid]alacağınız komut dosyasının işlem kimliği nerede list. Tüm komut dosyalarını durdurmak için şunu yazabilirsiniz:

$ forever stopall

10

nohup çalışma AWS Ubunto vm kontrol doğru izleyinsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

sonra enter tuşuna basın bu satırı göreceksiniz

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

sonra bunu yaz

rm nohup.out

resim açıklamasını buraya girin


3
Küçük bash isteminde ana bilgisayar adını nasıl boşalttığınızı seviyorum, ancak pencerenin büyük başlığında bıraktım con
conny

10

Kurulum

$ [sudo] npm install forever -g

Sonsuza kadar komut dosyalarını sürekli çalıştırmak için kullanabilirsiniz

forever start server.js

forever list

durak hizmeti için

forever stop server.js

9

İşte yeni bir başlangıç kişisel projelerim için kullandığım çözüm:

Yerleştirin /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Bu, çökmesi durumunda uygulamanızın yeniden doğmasını da sağlar. 15 saniyeden daha kısa sürede 3 veya daha fazla kez çökerse uygulamanızı yeniden doğurma girişimlerinden vazgeçecektir.


9

Geliştirme sırasında nodemon kullanmanızı tavsiye ederim . Bir dosya değiştiğinde sunucunuzu yeniden başlatır. Diğerlerinin de belirttiği gibi, Forever bir seçenektir ancak üretimde her şey kullandığınız platforma bağlıdır. Genellikle işletim sisteminin önerilen hizmetleri koruma yolunu kullanmak istersiniz (örn. Http://www.freedesktop.org/wiki/Software/systemd/ ).


Bu bir MEAN.JS uygulamasında benim için çalıştı - nodemonbir sunucu JS dosyası belirtmedikçe grunt komutunu çalıştırır, bu yüzden sonsuza dek / aynı anda mongo ve düğümü çalıştırmak için kullanıyorum
J-Dizzle


6

İlk olarak pm2'yi global olarak yükleyin

npm install -g pm2

Sonra başlat

pm2 start bin/www 

5

Başka bir yol, uygulamanız için bir sistem birimi oluşturmaktır. "/ etc / systemd / system" klasöründe aşağıdakine benzer bir "XXX.service" dosyası oluşturun:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Bir fayda, uygulama bir hizmet olarak çalışacak, çöktüğünde otomatik olarak yeniden başlatılır.

Sytemctl komutunu yönetmek için de kullanabilirsiniz:

systemctl start XXXhizmeti başlatmak, systemctl stop XXXdurdurmak ve systemctl enable XXXsistem önyüklendiğinde uygulamayı otomatik olarak başlatmak için.


4

Umarım bu sana yardımcı olmuştur.

Komut satırına sonsuza kadar yükleyin:

npm install forever -g

Örnek bir dosya oluşturun:

sudo nano server.js 

Dosyayı düzenleyebilir ve sonuçları doğrudan tarayıcınızdan alabilirsiniz.
Dosyayı düzenlemek için filezilla veya herhangi bir düzenleyiciyi kullanabilirsiniz. Dosyayı çalıştırmak için bu komutu çalıştırın:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

resim açıklamasını buraya girin


4

Başka bir paket kurmanıza gerek yok.

Bu komutu çalıştır

node server.js > stdout.txt 2> stderr.txt &

server.js , sunucu dosyanızdır veya api.js

Bundan sonra terminali kapatmak için " çıkış " tuşuna basın

exit


0

sonsuza kadar paket benim için çalıştı, sadece bir şey, derin eşit bağlıdır , bu yüzden böyle yüklemek ile sorun vardı:

npm -g install forever

Deneyin:

npm -g install forever deep-equal@1.1.1

yerine.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.