Bir node.js uygulamasını arka plan hizmeti olarak nasıl çalıştırabilirim?


503

Bu yazı yıllar boyunca çok dikkat çektiğinden, bu yazının altında platform başına en iyi çözümleri listeledim.


Orijinal yayın :

Node.js sunucumun arka planda çalışmasını istiyorum, yani: terminalimi kapattığımda sunucumun çalışmaya devam etmesini istiyorum. Ben bu googled ve bu öğretici ile geldi , ancak amaçlandığı gibi çalışmıyor. Bu daemon betiğini kullanmak yerine, çıkış yeniden yönlendirmesini ( 2>&1 >> fileparça) kullandığımı sanıyordum , ama bu da çıkmıyor - çıkışımda / hataları beklediği gibi terminalimde boş bir satır alıyorum.

Ayrıca işlemi arka plana koymaya çalıştım, ancak terminalimi kapatır kapatmaz süreç de öldürüldü.

Peki, yerel bilgisayarımı kapattığımda nasıl çalıştırabilirim?


En iyi çözümler :


3
Sanırım yerel sistemini kapatmak istiyordu
Kamal Reddy

46
bir ssh oturumunu kapatmak demek görevi sonlandırıyor
thedjaney

5
github.com/Unitech/pm2 son derece bakımlı ve çok kararlı bir süreç yöneticisidir, bir deneyin!
Unitech

1
Eğer ekran (kullanabilirsiniz aperiodic.net/screen/quick_reference )
karantan

Yanıtlar:


434

Cevabımı kendi Node.js uygulamasını kendi işlemi olarak nasıl çalıştırabilirim?

2015 yanıtı : hemen hemen her Linux dağıtımı sistemd ile birlikte gelir, bu da sonsuza dek, monit, PM2, vb. Artık gerekli değildir - işletim sisteminiz zaten bu görevleri yerine getirir .

Bir myapp.servicedosya oluşturun ('myapp' yerine uygulamanızın adını kullanın):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Unix'te yeniyseniz: ilk satırda /var/www/myapp/app.jsolması gerektiğini unutmayın #!/usr/bin/env node.

Hizmet dosyanızı /etc/systemd/system.

İle başlayın systemctl start myapp.

İle önyüklemede çalışmasını etkinleştirin systemctl enable myapp.

İle günlükleri görün journalctl -u myapp

Bu, Linux / düğüm sunucuları ( dosya dahil ) oluşturmak için bir AWS / DigitalOcean / Azure CloudConfig oluşturma komutlarını da içeren, Linux, 2018 sürümünde düğüm uygulamalarını nasıl dağıttığımızdan alınmıştır .service.


4
Upstart, mevcut olduğunda da iyi bir çözümdür. her iki durumda da, nodejs arka plan programınızın çalışmasını sağlamak için bir nodejs işlemine güvenmemelisiniz. Bu sadece işletim sistemi için bir görevdir. killall nodejs ve sonsuza kadar gitti ....
131

19
Systemd hizmetlerini kullanıcı olarak da çalıştırmanın mümkün olduğunu unutmayın. Örneğin bu eğiticiye bakın . Hizmet dosyanızı koyabilir ~/.config/systemd/user, ile başlatabilir, ile systemctl --user start myappetkinleştirebilirsiniz systemctl --user enable myapp.
cdauth

5
Bu cevap için teşekkürler. Saf ve net istediğim bu
bmavus

5
Bu cevabı "sonsuza dek" cevabı yerine kabul ettim, çünkü bunun en iyi yol olduğunu düşünüyorum. Mac ve Windows için benzer cevaplar var, ancak çoğunluğun bir Linux çözümü aradığını tahmin ediyorum.
Peter Kruithof

11
EC2'de AMI yolu / etc / systemd / system mevcut değil. AWS EC2 Linux AMI'de doğru yolun ne olduğunu gösterebilir misiniz?
René Michel

241

Forever, belirli bir düğüm komut dosyasının sürekli çalışmasını sağlamak için basit bir CLI aracı kullanabilirsiniz (yani sonsuza kadar): https://www.npmjs.org/package/forever


4
En son düğüm ile, bir uygulamayı komut dosyası adı (hata) üzerinden durduramadım - ayrıca - genellikle yanlış davranıyor (OS-X'te) - hepsi garip bir şekilde oluşturuldu. Kötü bir şey bıraktı, beni güvenle doldurmadı.
Michael Neale

4
Nohup hile yaparken, süreci daemonize ettiği için sonsuza dek daha iyi bir çözümdür. Harika bir araç!
Peter Kruithof

5
Bu arada, daha basit bir eğitim burada mevcuttur: Forever ile bir node.js sunucusunu takip edin
kehers

2
Forever'ı bir süre kullandım, başlangıçta her şey yolunda görünüyor ama sonra felaket oldu. Artık sonsuza kadar süreçleri yönetemedi ve çılgınca koşmalarına izin vermedi. Hala daha iyi bir çözüm bulmaya çalışıyoruz. Nohup kullanmaya çalışacağım
LN

5
Geoffrey- hayır, forever start /path/to/yourApp.jssunucu başlangıç ​​komut dosyasında yapmanız gerekecek .
mikermcneil

215

GÜNCELLEME - Aşağıdaki cevaplardan birinde belirtildiği gibi, PM2'nin sonsuza kadar eksik bazı güzel işlevleri vardır. Kullanmayı düşünün.

Orijinal Yanıt

Nohup kullanın :

nohup node server.js &

EDIT Kabul edilen cevabın gerçekten bir yol olduğunu eklemek istedim. Sonsuza kadar kalması gereken durumlarda kullanıyorum. Bunu npm install -g foreverdüğüm yolunda yapmayı seviyorum ve sonra sadeceforever start server.js


136
bilmek nohupiçin serin kısmı: no hangupModeminizi "kapattığınızda" bir süreci canlı tutmanızı istediğiniz eski günlerden gelir.
jAndy

1
günümüzde,
işlemcinin

7
En iyi çözüm bu değildir, çünkü uygulama yakalanmamış bir hatayla karşılaşırsa düğüm işlemi çıkacak ve yeniden başlamayacaktır. Yine de, geliştirme için makul bir seçenek.
Andy E

1
Buna çevresel değişkenleri nasıl eklerim? ör .: PORT = 80 düğüm sunucusu.js
Pardoner


67

Bu kabul edilemez bir yol olmayabilir, ancak özellikle geliştirme sırasında ekranla yapıyorum çünkü gerekirse geri getirip kandırabilirim.

screen
node myserver.js
>>CTRL-A then hit D

Ekran kapanır ve oturumunuzu kapatır. Sonra geri ekran -r yaparak geri alabilirsiniz. Daha fazla ayrıntı için ekran kılavuzuna basın. Ekranları adlandırabilirsiniz ve eğer isterseniz.


2
Ayrıca, tmux güzel. Ekran gibi çalışır (CTRL-A yerine CTRL-B varsayılandır, ancak yapılandırılabilir). Tmux'un panelleri vardır (bölünmüş ekranlar).
snapfractalpop

1
ekranın panelleri de var
Billy Moon

Bunu bir meteor uygulaması için birkaç haftadan beri kullanıyorum. Ayırma ve yeniden takma için bazen '$ screen -dr' gerekebilir.
Vinay Vemula

Benim için işi yapmanın en kolay yolu. Ama katılıyorum, en iyi çözüm değil
Pomme De Terre

Sistem yeniden başlatıldıktan sonra bu çözüm devam etmiyor
wnasich

60

2016 Güncellemesi: node-windows / mac / linux serisi tüm işletim sistemlerinde ortak bir API kullanır, bu yüzden kesinlikle ilgili bir çözümdür. Ancak; node-linux systemv init dosyalarını oluşturur. Systemd popülaritesi arttıkça, Linux'ta gerçekçi olarak daha iyi bir seçenektir. Birisi node-linux'a systemd desteği eklemek isterse PR'nin hoş geldiniz :-)

Orijinal Konu:

Bu şimdi oldukça eski bir iş parçacığıdır, ancak düğüm pencereleri Windows'ta arka plan hizmetleri oluşturmak için başka bir yol sağlar. Düğüm betiğinizin etrafında nssmbir exesarıcı kullanma kavramına gevşekçe dayanır . Ancak; bunun winsw.exeyerine kullanır ve işlemin hatalarda nasıl başladığı / durduğuna ilişkin daha ayrıntılı denetim için yapılandırılabilir bir düğüm sarmalayıcı sağlar. Bu işlemler diğer hizmetler gibi kullanılabilir:

resim açıklamasını buraya girin

Modül ayrıca bazı olay kayıtlarında da pişirme yapar:

resim açıklamasını buraya girin

Senaryonuzun Daemonize kod ile yapılır. Örneğin:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

Modül, yeniden başlatmaların kapatılması (kötü komut dosyaları sunucunuzu hortumlamıyor) ve yeniden başlatmalar arasında artan zaman aralıkları gibi şeyleri destekler.

Düğüm pencereleri hizmetleri başkaları gibi çalıştığından, zaten kullandığınız yazılımlarla hizmeti yönetmek / izlemek mümkündür.

Son olarak, makebağımlılıklar yoktur . Başka bir deyişle, açık bir npm install -g node-windowsşekilde çalışacaktır. Bunu yüklemek için Visual Studio, .NET veya node-gyp sihri gerekmez. Ayrıca, MIT ve BSD lisanslıdır.

Tam açıklamada, bu modülün yazarıyım. OP'nin yaşadığı acıyı hafifletmek için tasarlanmıştır, ancak İşletim Sistemi'nin zaten sağladığı işlevselliğe daha sıkı entegrasyon ile. Umarım bu aynı soruyla gelecekteki izleyiciler bunu yararlı bulur.


8
Şimdi bunu OSX'te aynı işlevselliği sağlayarak node-mac'a taşıdım.
Corey

1
Birkaç Düğüm programı planlamak ve düğüm pencerelerini, Forever veya Kue'yu seçme kararından önce durmak için geldim. Düğüm pencerelerine yaslanıyorum, ancak bir düzine düğüm programını programlamak ve izlemek istediğimde Forever veya Kue'yu neden kullanmıyorsun anlamak istiyorum. Bazıları sonsuza dek koşuyor. İzlenmesi de gerekiyor.
Christiaan Westerbeek

5
Düğüm pencereleri, arka plan hizmetlerini yönetmek için yerel işletim sistemini ve günlük kaydı için yerel olay günlüğünü kullanır. Forever'ın kendi özel izleme ve günlük kaydı vardır. Bu konuda medium.com/p/2a602ea657a2 adresinde bir makale yazdım . Komut dosyalarınızı zamanlamak için arka plan hizmetleri olarak çalıştırmamanız gerektiği anlaşılıyor . Kue ve Agenda gibi projeler bunun için tasarlandı. Düğüm pencereleri ve Sonsuza dek farklı bir amaca hizmet eder.
Corey

1
? @Corey i düğüm-mac dahil örnek çalıştırmak, nasıl terminali gelen i düğüm install.js çalıştı, ama pikap helloworld.js görünmüyor
Edwin Ikechukwu Okonkwo

@Edwin - Kullandığınız kod da dahil olmak üzere sorunla ilgili daha ayrıntılı yeni bir soru açmak en iyisi olabilir.
Corey

28

GÜNCELLEME : ben pm2 en son dahil etmek için güncellendi:

birçok kullanım durumunda, bir sistem hizmetini kullanmak bir düğüm sürecini yönetmenin en basit ve en uygun yoludur. tek bir ortamda çok sayıda düğüm işlemi veya bağımsız olarak çalışan düğüm mikro hizmetlerini çalıştıranlar için pm2 daha eksiksiz bir araçtır.

https://github.com/unitech/pm2

http://pm2.io

  • gerçekten yararlı bir izleme özelliğine sahiptir -> ile birden fazla işlemin komut satırı izlenmesi pm2 monitveyapm2 list
  • organize Log yönetimi -> pm2 logs
  • diğer şey:
    • Davranış yapılandırması
    • Kaynak harita desteği
    • PaaS Uyumlu
    • İzle ve Yeniden Yükle
    • Modül Sistemi
    • Maksimum bellek yeniden yükleme
    • Küme Modu
    • Sıcak yeniden yükleme
    • Geliştirme iş akışı
    • Başlangıç ​​Komut Dosyaları
    • Otomatik tamamlama
    • Dağıtım iş akışı
    • Keymetrics izleme
    • API

20

Komut dosyasını tamamlanıncaya kadar kesintisiz olarak çalıştırmak istiyorsanız, nohupburada yanıtlarda belirtildiği gibi kullanabilirsiniz . Ancak, yanıtların hiçbiri aynı zamanda günlükleri stdinve tam bir komut vermez stdout.

nohup node index.js >> app.log 2>&1 &
  • >>Araçlar için ekleme app.log.
  • 2>&1hatalar da göndermek olduğundan emin kılar stdoutve ilave app.log.
  • Bitiş &, geçerli terminalinizin komutla bağlantısının kesildiğinden emin olur, böylece çalışmaya devam edebilirsiniz.

Bir düğüm sunucusu (veya sunucu yeniden başlatıldığında yeniden başlatılması gereken bir şey) çalıştırmak istiyorsanız systemd / systemctl kullanmanız gerekir .


1
en iyi cevap m8.
bholagabbar

1
güzel açıkladı
Prakhar Prakash Bhardwaj

19

OSX çalıştırıyorsanız, gerçek bir sistem işlemi üretmenin en kolay yolu, launchdonu başlatmak için kullanmaktır .

Bunun gibi bir plist oluşturun ve / Library / LaunchDaemons adıyla top-level-domain.your-domain.application.plist(yerleştirirken kök olmanız gerekir) koyun:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Tamamlandığında, bunu (kök olarak) yayınlayın:

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

ve koşuyorsun.

Ve yeniden başlattıktan sonra da çalışmaya devam edeceksiniz.

Plisteki diğer seçenekler için buradaki man sayfasına bakın: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


Bu, hizmeti hangi kullanıcı olarak çalıştırır? Kullanıcıyı ayarlamanın bir yolu var mı?
rjmunro

15

Nohup kullanıyorsanız bu komutu çalıştırmayı deneyin -

nohup npm start 2>/dev/null 1>/dev/null&

Sonsuza kadar sunucuyu başlatmak için de kullanabilirsiniz

forever start -c "npm start" ./ 

PM2 ayrıca destekler npm start

pm2 start npm -- start

2
thnx, bu mükemmel çalıştı. pm2 start npm -- start
yadavr

13

Sadece daemon npm modülünü kullanıyorum:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

Son zamanlarda ben de kullanıyorum mon (1) den TJ Holowaychuk başlatmak ve basit düğüm uygulamaları yönetmek için.


12

Geliştirme için Süpervizör kullanıyorum. Sadece çalışıyor. Bir .js dosyasında değişiklik yaptığınızda Süpervizör bu değişiklikler yüklendiğinde uygulamanızı otomatik olarak yeniden başlatır.

İşte Github sayfasına bir bağlantı

Yüklemek :

sudo npm install supervisor -g

-E ile kolayca diğer uzantıları izlemesini sağlayabilirsiniz. Sık kullandığım bir başka komut da -i'dir ve belirli klasörleri yok saymaktır.

Çıkış yaptıktan sonra bile düğüm uygulamanızın arka planda çalışmasını sağlamak için nohup ve supervisor kullanabilirsiniz.

sudo nohup danışmanı myapp.js &


1
Pratikte süpervizörün, özellikle güncellemeleri kontrol etmek için bir web kancası ile birlikte kullanılan birçok daemon modülünden daha iyi bir seçenek olduğunu düşünüyorum.
Iain Collins

Bunu ikinciyim. PHP dosyalarını değiştirirseniz, Apache veya Nginx sunucusunu yeniden başlatır mısınız? Kesinlikle hayır. O zaman neden tüm Node.js sunucusunu yeniden başlatmak için uğraşmak bile bir kod satırını değiştiriyor? Bu en iyi çözüm olmasa da, Danışman ile birlikte yeniden başlatma işlemi hakkında endişelenmenize gerek yoktur (aslında yeniden başlatma hala gerçekleşir).
Zhang Buzz

7

WINDOWS XP'de arka plan hizmeti olarak Node.js

Kurulum:

  1. WGET http://gnuwin32.sourceforge.net/packages/wget.htm'yi yükleyici yürütülebilir dosyası ile yükleyin
  2. GIT http://code.google.com/p/msysgit/downloads/list'i yükleyici yürütülebilir dosyası aracılığıyla yükleyin
  3. Nnsm.exe dosyasını% windir% / system32 klasörüne kopyalayarak NSSM http://nssm.cc/download/?page=download yükleyin
  4. C: \ node \ helloworld.js dosyası oluşturun

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. Komut konsolunu açın ve aşağıdakileri yazın (yalnızca Kaynak Seti yüklüyse setx)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. Şık bir toplu iş c: \ node \ ServiceMe.cmd oluşturmaktır

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

Servis Yönetimi:

  • Hizmetlere artık Start-> Run-> services.msc veya Start-> Run-> MSCONFIG-> Services aracılığıyla erişilebilir (ve 'Tüm Microsoft Hizmetlerini Gizle' seçeneğini işaretleyin).
  • Komut dosyası, toplu iş komut dosyası aracılığıyla yapılan her düğümün başına 'düğüm-' ekler.
  • Aynı şekilde kayıt defterinde bulunabilir: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "

7

Kabul edilen cevap muhtemelen en iyi üretim cevabıdır, ancak dev işi yapmak için hızlı bir kesmek için şunu buldum:

nodejs scriptname.js & işe yaramadı, çünkü nodejs & 'i kazıyor gibiydi ve bu yüzden şey scriptname.js ölmeden terminali kullanmaya devam etmeme izin vermedi.

Ama nodejs scriptname.jsbir .sh dosyası koydum ve nohup sh startscriptname.sh &çalıştım.

Kesinlikle bir üretim şey değil, ama "Terminalimi kullanmaya devam etmeliyim ve 5 farklı terminal başlatmak istemiyorum" sorununu çözüyor.


4

Linux sunucusunda nodejs çalıştırıyorsanız, bunun en iyi yol olduğunu düşünüyorum.

Bir servis betiği oluşturun ve /etc/init/nodejs.conf dosyasına kopyalayın

hizmeti başlat: sudo hizmeti nodejs başlat

durdurma hizmeti: sudo hizmeti nodejs durdur

Sevice alfabesi

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

4

Haziran 2017 Güncelleme:
Linux için çözüm: (Red hat). Önceki yorumlar benim için çalışmıyor. Bu benim için Amazon Web Service - Red Hat 7'de çalışıyor. Umarım bu birileri için işe yarar.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add

Çok ilginç, sadece iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080ne yaptığını merak ediyorum . Bana daha fazla ayrıntı verebilir misiniz lütfen. Emin değilim ama gelen trafiği yönlendirir düşünmek 80için 8080sağa, hangi düğümün sunucu dinler?
Shakiba Moshiri

3

nssm'yi windows için en iyi çözümü kullanın , sadece nssm'yi indirin , cmd'den nssm dizinine açın ve yazın

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

bu, services.msc adresinde listelenecek yeni bir windows hizmeti yükleyecektir , buradan hizmeti başlatabilir veya durdurabilirsiniz, bu hizmet otomatik olarak başlayacak ve başarısız olursa yeniden başlayacak şekilde yapılandırabilirsiniz.




1

kimse "2> & 1" pozisyonu önemsiz bir yanlış fark ettiniz mi?

2>&1 >> file

olmalı

>> file 2>&1

1

Uzak ana bilgisayarlarda çoklu pencere / bölme geliştirme ortamı için tmux kullanıyorum. Sürecin arka planda çalışmasını sağlamak ve ayırmak gerçekten çok basit. Tmux'a bir göz atın


1

Daemon npm modülünün daha yeni sürümlerini kullanan kişiler için - dizeler yerine dosya tanımlayıcılarını iletmeniz gerekir:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

0

PM2, dahili yük dengeleyicisine sahip Node.js uygulamaları için bir üretim süreci yöneticisidir. Uygulamaları sonsuza kadar canlı tutmanıza, kesinti olmadan yeniden yüklemenize ve genel sistem yöneticisi görevlerini kolaylaştırmanıza olanak tanır. https://github.com/Unitech/pm2


ciddi bellek tüketimi sorunları! phusion + nginx için git
Rizwan Patel

0

Kimsenin Guvnor'dan bahsetmediğine şaşırdım

Sonsuza kadar denedim, pm2, vb. Ancak, sağlam kontrol ve web tabanlı performans metrikleri söz konusu olduğunda, Guvnor'un açık ara en iyi olduğunu gördüm . Ayrıca, aynı zamanda tamamen açık kaynak.

resim açıklamasını buraya girin

Düzenleme: Ancak, windows üzerinde çalışıp çalışmadığından emin değilim. Ben sadece linux üzerinde kullandım.


4
2017 itibariyle bayat görünüyor. İnşa başarısız. Geçen yıl hiçbir kod aktarılmadı. Şüpheli.
azatar

0

Verilen cevaplar listesinde bu seçeneği kaçırdığım için 2020'den itibaren uygun bir seçenek eklemek istiyorum: docker veya herhangi bir eşdeğer konteyner platformu. Uygulamanızın istikrarlı bir ortamda çalıştığından emin olmanın yanı sıra, gelişmiş güvenlik özelliklerinin yanı sıra ek güvenlik avantajları da vardır.

Windows, macOS ve çoğu / büyük Linux dağıtımları için docker desteği vardır. Bağlantı istasyonunu desteklenen bir platforma kurmak oldukça basittir ve iyi belgelenmiştir. Node.js uygulaması oluşturmak, kapsayıcıya koymak ve kapsayıcıdan sonra yeniden başlatıldığından emin olmak için o kapsayıcıyı çalıştırmak kadar basittir.

Kapsayıcı Resmi Oluştur

Başvurunuzu varsayarsak mevcuttur / home / me / my-app söz konusu sunucuda bir metin dosyası oluşturun Dockerfile klasöründe / home / me / my-app buna benzer içerik ile:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

Görüntüyü şu komutu kullanarak oluşturun:

docker build -t myapp-as-a-service /home/me

Not: Son parametre, Dockerfile'ın kendisi yerine bu Dockerfile dosyasını içeren klasörü seçmektir. -F seçeneğini kullanarak farklı bir tane seçebilirsiniz .

Kapsayıcıyı Başlat

Kapsayıcıyı başlatmak için bu komutu kullanın:

docker run -d --restart always -p 80:3000 myapp-as-a-service

Bu komut, uygulamanızın 3000 numaralı bağlantı noktasını dinlediğini ve ana makinenizin 80 numaralı bağlantı noktasında gösterilmesini istediğinizi varsayar.

Bu çok sınırlı bir örnek, ama iyi bir başlangıç ​​noktası.


0

Pm2 kullanıyorsanız, şu değere autorestartayarlı olarak kullanabilirsiniz false:

$ pm2 ekosistem

Bu bir örnek oluşturur ecosystem.config.js:

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$ pm2 başlangıç ​​ecosystem.config.js


-1

Bu cevap partiye oldukça geç, ancak en iyi çözümün hem screen -dmSve nohupkomutlarını kullanan bir kabuk betiği yazmak olduğunu buldum .

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Ayrıca >> logfiledüğümü kolayca ekleyebilmem için ucunu biraz ekliyorumconsole.log() ifadelerini .

Neden bir kabuk komut dosyası kullandım? Peki ben de görmek için kontrol bir if deyimi ekledinode myserver.js sürecin zaten çalışıp çalışmadığını .

Bu şekilde, hem sunucuyu devam ettirmemi hem de değişiklikler yaptığımda yeniden başlatmamı sağlayan tek bir komut satırı seçeneği oluşturabildim, bu da geliştirme için çok yararlı.


2
Bu sorunla karşılaştım ve Linux için oldukça yeniyim. Ekran veya nohup olmadan nasıl yapardınız?
Craig Norton
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.