Jak uruchomić aplikację node.js jako usługę w tle?


503

Ponieważ ten post zyskał wiele uwagi przez lata, na dole tego wpisu umieściłem najlepsze rozwiązania dla poszczególnych platform.


Oryginalny post :

Chcę, aby mój serwer node.js działał w tle, tzn .: kiedy zamykam terminal, chcę, aby mój serwer nadal działał. Poszukałem go i wymyśliłem ten samouczek , jednak nie działa on zgodnie z przeznaczeniem. Więc zamiast używać tego skryptu demona, pomyślałem, że po prostu użyłem przekierowania wyjściowego ( 2>&1 >> fileczęść), ale to też się nie kończy - w moim terminalu pojawia się pusta linia, jakby czekała na wyjście / błędy.

Próbowałem również umieścić proces w tle, ale jak tylko zamknę terminal, proces również zostanie zabity.

Jak mogę więc pozostawić go uruchomionym, kiedy wyłączam komputer lokalny?


Najlepsze rozwiązania :


3
Myślę, że chciał zamknąć swój system lokalny
Kamal Reddy,

46
miał na myśli zamknięcie sesji ssh, która kończy zadanie
thejaney

5
github.com/Unitech/pm2 to bardzo utrzymany i bardzo stabilny menedżer procesów, spróbuj!
Unitech

1
można użyć ekranu ( aperiodic.net/screen/quick_reference )
karantan

Odpowiedzi:


433

Kopiowanie własnej odpowiedzi z Jak uruchomić aplikację Node.js jako własny proces?

Odpowiedź z 2015 roku : prawie każda dystrybucja Linuksa jest dostarczana z systememd, co oznacza, że ​​na zawsze nie są już potrzebne monitory, PM2 itp. - Twój system operacyjny już obsługuje te zadania .

Utwórz myapp.serviceplik (oczywiście zastępując „myapp” nazwą aplikacji):

[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

Uwaga: jeśli dopiero zaczynasz korzystać z Uniksa:/var/www/myapp/app.js powinien być #!/usr/bin/env nodew pierwszej linii.

Skopiuj plik usługi do /etc/systemd/system.

Zacznij od systemctl start myapp.

Włącz go, aby uruchamiał się przy rozruchu systemctl enable myapp.

Zobacz dzienniki z journalctl -u myapp

To pochodzi z tego, jak wdrażamy aplikacje węzłów w systemie Linux, edycja 2018 , która obejmuje również polecenia do generowania AWS / DigitalOcean / Azure CloudConfig do budowania serwerów Linux / węzłów (w tym .servicepliku).


4
Upstart, jeśli jest dostępny, jest również dobrym rozwiązaniem. tak czy inaczej, nie powinieneś polegać na procesie nodejs, aby utrzymać działanie demona nodejs. Jest to jedno zadanie wyłącznie dla systemu operacyjnego. killall nodejs i na zawsze odejdzie ....
131

19
Pamiętaj, że możliwe jest również uruchamianie usług systemowych jako użytkownik. Zobacz na przykład ten samouczek . Możesz umieścić plik usługi ~/.config/systemd/user, uruchomić go za pomocą systemctl --user start myapp, włączyć za pomocą systemctl --user enable myapp.
cdauth

5
Dziękuję za tę odpowiedź. Właśnie tego chcę czyste i jasne
bmavus

5
Zaakceptowałem tę odpowiedź zamiast odpowiedzi „na zawsze”, ponieważ uważam również, że jest to najlepszy sposób, aby to zrobić. Istnieją podobne odpowiedzi dla komputerów Mac i Windows, ale domyślam się, że większość szuka rozwiązania dla systemu Linux.
Peter Kruithof

11
w EC2 ścieżka AMI / etc / systemd / system nie istnieje. Czy potrafisz wskazać prawidłową ścieżkę w AWS EC2 Linux AMI?
René Michel,

241

Możesz użyć Forever, prostego narzędzia CLI do zapewnienia ciągłości działania danego skryptu węzła (tj. Na zawsze): https://www.npmjs.org/package/forever


4
W najnowszym węźle nie udało mi się zatrzymać aplikacji za pomocą nazwy skryptu (błąd) - także - ogólnie źle się zachowuje (było na OS-X) - wszystkie dziwnie zbudowane ze źródła. Pozostawił rzeczy w złym stanie, nie napełnił mnie pewnością siebie.
Michael Neale,

4
Chociaż nic nie rozwiązuje problemu, wieczność jest lepszym rozwiązaniem, ponieważ demonizuje proces. Świetne narzędzie!
Peter Kruithof,


2
Przez jakiś czas korzystałem z Forever, na początku wszystko wydaje się w porządku, ale potem nastąpiła katastrofa. Forever nie mógł już dłużej zarządzać procesami i pozwolić im działać dziko. Wciąż próbuję znaleźć lepsze rozwiązanie. Spróbuję użyć nohup
LN

5
Geoffrey - nie, musisz to zrobić forever start /path/to/yourApp.jsw skrypcie uruchamiania serwera.
mikermcneil

215

AKTUALIZACJA - Jak wspomniano w jednej z odpowiedzi poniżej, PM2 ma naprawdę niezłą funkcjonalność, której brakuje na zawsze. Rozważ użycie go.

Oryginalna odpowiedź

Użyj nohup :

nohup node server.js &

EDYCJA Chciałem dodać, że zaakceptowana odpowiedź jest naprawdę dobrą drogą. Używam wiecznie w instancjach, które muszą pozostać bezczynne. Lubię to robić npm install -g forever, to jest na ścieżce węzła, a potem po prostu zrobićforever start server.js


136
fajna część do poznania: nohupoznacza, no hangupktóra pochodzi z dawnych czasów, kiedy chciałeś, aby proces był aktywny, gdy „rozłączasz” modem.
jAndy,

1
obecnie jest to raczej nazwa sygnału 1, który procesy odbierają, aby ostrzec, że użytkownik zamknął powłokę (lub utracił połączenie modemowe, oczywiście: P)
lapo

7
Nie jest to najlepsze rozwiązanie, ponieważ jeśli aplikacja napotka nieprzechwycony błąd, proces węzła zakończy działanie i nie uruchomi się ponownie. Jest to jednak rozsądna opcja rozwoju.
Andy E

1
Jak do tego dodać zmienne środowiskowe? np .: PORT = 80 węzłów
server.js

1
Sprawdź tę odpowiedź na stronie SO - stackoverflow.com/questions/8825460/…
NG.

67

Może nie jest to akceptowany sposób, ale robię to z ekranem, szczególnie w fazie rozwoju, ponieważ mogę go przywrócić i oszukać w razie potrzeby.

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

Ekran odłączy się i przetrwa wylogowanie. Następnie możesz go odzyskać, robiąc screen -r. Poszukaj bardziej szczegółowych informacji w instrukcji obsługi ekranu. Możesz nazwać ekrany i co tam, jeśli chcesz.


2
Poza tym tmux jest fajny. Działa jak screen (CTRL-B jest domyślny zamiast CTRL-A, ale można go konfigurować). Tmux ma panele (podzielone ekrany).
snapfractalpop

1
ekran też ma panele
Billy Moon

Używam tego od kilku tygodni do aplikacji Meteor. Czasami może być wymagane `$ screen -dr 'do odłączania i ponownego podłączania.
Vinay Vemula,

Dla mnie najprostszy sposób na wykonanie pracy. Ale zgadzam się, że nie jest to najlepsze rozwiązanie
Pomme De Terre

To rozwiązanie nie utrzymuje się po ponownym uruchomieniu systemu
wnasich

60

Aktualizacja 2016: Seria node-windows / mac / linux używa wspólnego API we wszystkich systemach operacyjnych, więc jest to absolutnie odpowiednie rozwiązanie. Jednak; node-linux generuje systemowe pliki inicjujące. Ponieważ systemd stale zyskuje na popularności, jest to w rzeczywistości lepsza opcja w systemie Linux. PR jest mile widziany, jeśli ktoś chce dodać obsługę systemową do node-linux :-)

Oryginalny wątek:

Jest to dość stary wątek, ale węzły-okna zapewniają inny sposób tworzenia usług w tle w systemie Windows. Jest luźno oparty na nssmkoncepcji użycia exeopakowania wokół skryptu węzła. Jednak; używa winsw.exezamiast tego i zapewnia konfigurowalne opakowanie węzła dla bardziej szczegółowej kontroli nad sposobem uruchamiania / zatrzymywania procesu w przypadku awarii. Te procesy są dostępne jak każda inna usługa:

wprowadź opis zdjęcia tutaj

Moduł piecze także przy logowaniu niektórych zdarzeń:

wprowadź opis zdjęcia tutaj

Daemonizacja skryptu odbywa się za pomocą kodu. Na przykład:

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();

Moduł obsługuje takie elementy, jak ograniczanie restartów (więc złe skrypty nie łączą serwera) i wydłużanie odstępów czasu między restartami.

Ponieważ usługi węzłów-okien działają jak wszystkie inne, możliwe jest zarządzanie / monitorowanie usługi za pomocą dowolnego oprogramowania, którego już używasz.

Wreszcie nie ma makezależności. Innymi słowy, proste npm install -g node-windowsbędzie działać. Nie potrzebujesz Visual Studio, .NET ani magii gyp-node, aby to zainstalować. Ponadto jest na licencji MIT i BSD.

W pełnym ujawnieniu jestem autorem tego modułu. Został zaprojektowany, aby złagodzić dokładny ból, jakiego doświadczył OP, ale dzięki ściślejszej integracji z funkcjonalnością, którą system operacyjny już zapewnia. Mam nadzieję, że przyszli widzowie z tym samym pytaniem uznają je za przydatne.


8
Teraz przeniosłem to na node-mac , zapewniając tę ​​samą funkcjonalność w OSX.
Corey

1
Doszedłem do punktu, aby zaplanować kilka programów Node i stanąć przed decyzją o wyborze okna-węzła, Forever lub Kue. Opieram się na oknach węzłów, ale chciałbym zrozumieć, dlaczego nie użyć Forever lub Kue, gdy chcę zaplanować i monitorować kilkanaście programów węzłów. Niektórzy biegają wiecznie. Potrzebuję też monitorowania.
Christiaan Westerbeek

5
Node-windows używa natywnego systemu operacyjnego do zarządzania usługami w tle, a natywny dziennik zdarzeń do rejestrowania. Forever ma własne niestandardowe monitorowanie i rejestrowanie. Napisałem o tym artykuł na medium.com/p/2a602ea657a2. Wygląda na to, że musisz zaplanować swoje skrypty, a nie uruchamiać je cały czas jako usługi w tle. Projekty takie jak Kue i Agenda są do tego stworzone. Node-windows & Forever służą innym celom.
Corey

1
@Corey, jak uruchomić przykład zawarty w węźle mac ?, z terminalu próbowałem węzła install.js, ale wydaje się, że nie odbiera helloworld.js
Edwin Ikechukwu Okonkwo

@Edwin - Być może najlepiej będzie otworzyć nowe pytanie z bardziej szczegółowymi informacjami na temat problemu, w tym używanego kodu.
Corey,

28

AKTUALIZACJA : zaktualizowałem, aby uwzględnić najnowsze od pm2:

w wielu przypadkach użycie usługi systemowej jest najprostszym i najbardziej odpowiednim sposobem zarządzania procesem węzła. dla tych, którzy uruchamiają wiele procesów węzłowych lub niezależnie działające mikrousługi węzłowe w jednym środowisku, pm2 jest bardziej funkcjonalnym narzędziem.

https://github.com/unitech/pm2

http://pm2.io

  • ma naprawdę przydatną funkcję monitorowania -> ładne „gui” do monitorowania wielu procesów za pomocą wiersza poleceń pm2 monitlub listy procesów za pomocąpm2 list
  • zorganizowane zarządzanie logami -> pm2 logs
  • inne rzeczy:
    • Konfiguracja zachowania
    • Obsługa map źródłowych
    • Kompatybilny z PaaS
    • Obejrzyj i załaduj ponownie
    • System modułowy
    • Maksymalne przeładowanie pamięci
    • Tryb klastrowy
    • Gorące przeładowanie
    • Przepływ pracy programistycznej
    • Skrypty startowe
    • Automatyczne uzupełnianie
    • Przepływ pracy wdrażania
    • Monitorowanie keymetrii
    • API

19

Jeśli używasz OSX, najłatwiejszym sposobem na stworzenie prawdziwego procesu systemowego jest launchdjego uruchomienie.

Zbuduj taki plist i umieść go w / Library / LaunchDaemons o nazwie top-level-domain.your-domain.application.plist(musisz być root podczas umieszczania go):

<?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>

Po zakończeniu wydaj (jako root):

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

i biegniesz.

I nadal będziesz działać po ponownym uruchomieniu.

Inne opcje na liście znajdują się na stronie man tutaj: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


Jakiego użytkownika będzie to usługa? Czy istnieje sposób na ustawienie użytkownika?
rjmunro

19

Jeśli chcesz po prostu uruchomić skrypt nieprzerwanie, dopóki się nie zakończy, możesz użyć tego, nohupjak już wspomniano w odpowiedziach tutaj. Jednak żadna z odpowiedzi nie zawiera pełnego polecenia, które również rejestruje stdini stdout.

nohup node index.js >> app.log 2>&1 &
  • Te >>środki dołączyć do app.log.
  • 2>&1upewnia się, że błędy są również wysyłane stdouti dodawane do app.log.
  • Zakończenie &gwarantuje, że twój aktualny terminal jest odłączony od polecenia, dzięki czemu możesz kontynuować pracę.

Jeśli chcesz uruchomić serwer węzłów (lub coś, co powinno uruchomić się ponownie po ponownym uruchomieniu serwera), powinieneś użyć systemd / systemctl .


1
najlepsza odpowiedź m8.
bholagabbar

1
ładnie wyjaśnione
Prakhar Prakash Bhardwaj

15

Spróbuj uruchomić to polecenie, jeśli używasz nohup -

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

Możesz także użyć na zawsze, aby uruchomić serwer

forever start -c "npm start" ./ 

PM2 obsługuje również npm start

pm2 start npm -- start

2
Dzięki, działało to idealnie. pm2 start npm -- start
yadavr

13

Po prostu używam demona npm modułu:

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
});

Ostatnio używam również mon (1) z TJ Holowaychuk do uruchamiania prostych aplikacji węzłów i zarządzania nimi.


12

Używam Supervisora ​​do programowania. To po prostu działa. Za każdym razem, gdy wprowadzasz zmiany w pliku .js, Supervisor automatycznie uruchamia ponownie aplikację po załadowaniu tych zmian.

Oto link do strony Github

Zainstalować :

sudo npm nadzorca instalacji -g

Możesz z łatwością sprawić, że będzie oglądać inne rozszerzenia za pomocą -e. Innym poleceniem, którego często używam, jest -i, aby zignorować niektóre foldery.

Możesz użyć nohup i supervisora, aby aplikacja węzła działała w tle nawet po wylogowaniu.

sudo nohup supervisor myapp.js &


1
Myślę, że w praktyce superwizor jest lepszą opcją niż większość modułów demona, szczególnie używaną w połączeniu z hakiem do sprawdzania aktualizacji.
Iain Collins

Popieram ten. Jeśli zmienisz pliki PHP, czy zrestartujesz serwer Apache lub Nginx? Absolutnie nie. Więc po co zawracać sobie głowę ponownym uruchomieniem całego serwera Node.js, wystarczy zmienić tylko jeden wiersz kodu? Chociaż może to nie być najlepsze rozwiązanie, w dzierżawie u Supervisora ​​nie musisz się martwić procesem restartu (w rzeczywistości restart nadal się odbywa).
Zhang Buzz

7

Node.js jako usługa działająca w tle w WINDOWS XP

Instalacja:

  1. Zainstaluj WGET http://gnuwin32.sourceforge.net/packages/wget.htm za pomocą pliku wykonywalnego instalatora
  2. Zainstaluj GIT http://code.google.com/p/msysgit/downloads/list za pomocą pliku wykonywalnego instalatora
  3. Zainstaluj NSSM http://nssm.cc/download/?page=download poprzez skopiowanie nnsm.exe do folderu% windir% / system32
  4. Utwórz c: \ node \ helloworld.js

    // 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. Otwórz konsolę poleceń i wpisz następujące polecenie (setx tylko, jeśli zainstalowany jest zestaw zasobów)

    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. Sprytną partią jest tworzenie c: \ node \ ServiceMe.cmd

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

Zarządzanie usługami:

  • Same usługi są teraz dostępne przez Start-> Uruchom-> services.msc lub przez Start-> Uruchom-> MSCONFIG-> Usługi (i zaznacz „Ukryj wszystkie usługi Microsoft”).
  • Skrypt poprzedzi każdy węzeł utworzony za pomocą skryptu wsadowego słowem „node-”.
  • Podobnie można je znaleźć w rejestrze: „ HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx

7

Przyjęta odpowiedź jest prawdopodobnie najlepszą odpowiedzią produkcyjną, ale dla szybkiego włamania do pracy programistów znalazłem to:

nodejs scriptname.js & nie działało, ponieważ nodejs wydawał się pochłaniać &, a więc ta rzecz nie pozwoliła mi używać terminala bez śmierci scriptname.js.

Ale nodejs scriptname.jswstawiłem plik .sh i nohup sh startscriptname.sh &zadziałałem.

Zdecydowanie nie jest to kwestia produkcyjna, ale rozwiązuje problem „Muszę nadal używać mojego terminala i nie chcę uruchamiać 5 różnych terminali”.


4

Jeśli korzystasz z nodejs na serwerze linux, myślę, że to najlepszy sposób.

Utwórz skrypt usługi i skopiuj do /etc/init/nodejs.conf

uruchom usługę: sudo service nodejs start

zatrzymaj usługę: sudo service nodejs stop

Sevice script

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

Aktualizacja z czerwca 2017 r .:
Rozwiązanie dla systemu Linux: (Red hat). Poprzednie komentarze nie działają dla mnie. Działa to dla mnie na Amazon Web Service - Red Hat 7. Mam nadzieję, że to zadziała dla kogoś.

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

bardzo ciekawe, jestem ciekawy, iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080co to robi. Czy możesz podać mi więcej szczegółów. Nie jestem pewien, ale myślę, że przekierowuje ruch z 80do 8080którego węzeł serwer słucha, prawda?
Shakiba Moshiri

3

użyj nssm najlepszego rozwiązania dla systemu Windows, po prostu pobierz nssm , otwórz katalog cmd i nssm i wpisz

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

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

Spowoduje to zainstalowanie nowej usługi systemu Windows, która będzie wymieniona na stronie services.msc. Stamtąd możesz uruchomić lub zatrzymać usługę, ta usługa uruchomi się automatycznie i możesz skonfigurować ponowne uruchomienie, jeśli się nie powiedzie.




1

czy ktoś zauważył trywialny błąd co do pozycji „2> i 1”?

2>&1 >> file

Powinien być

>> file 2>&1

1

Korzystam z tmux do środowiska programowania wielu okien / okien na zdalnych hostach. Naprawdę łatwo jest odłączyć i utrzymać proces w tle. Spójrz na tmux


1

Dla osób korzystających z nowszych wersji modułu demona npm - musisz przekazać deskryptory plików zamiast ciągów:

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 jest menedżerem procesów produkcyjnych dla aplikacji Node.js z wbudowanym modułem równoważenia obciążenia. Pozwala utrzymać aplikacje przy życiu na zawsze, przeładować je bez przestojów i ułatwić typowe zadania administracyjne systemu. https://github.com/Unitech/pm2


poważne problemy z zużyciem pamięci! idź na phusion + nginx
Rizwan Patel

0

Dziwi mnie, że nikt nie wspominał o Guvnorze

Próbowałem od zawsze, pm2 itd. Ale jeśli chodzi o solidną kontrolę i miary wydajności oparte na sieci, stwierdziłem, że Guvnor jest zdecydowanie najlepszy. Dodatkowo jest to również w pełni open source.

wprowadź opis zdjęcia tutaj

Edycja: Nie jestem jednak pewien, czy działa w systemie Windows. Użyłem go tylko na Linuksie.


4
Wydaje się nieaktualny od 2017 r. Kompilacja nie powiodła się. Brak kodu w ostatnim roku. Wątpliwy.
azatar

0

Ponieważ brakuje mi tej opcji na liście podanych odpowiedzi, chciałbym dodać kwalifikującą się opcję od 2020 r .: doker lub dowolną równoważną platformę kontenerową . Oprócz zapewnienia, że ​​aplikacja działa w stabilnym środowisku, istnieją dodatkowe korzyści bezpieczeństwa, a także poprawiona przenośność.

Obsługiwane jest okno dokowane dla systemu Windows, macOS i większości / głównych dystrybucji Linuksa. Instalowanie dokera na obsługiwanej platformie jest raczej proste i dobrze udokumentowane. Konfigurowanie aplikacji Node.js jest tak proste, jak umieszczenie jej w kontenerze i uruchomienie tego kontenera przy jednoczesnym upewnieniu się, że zostanie on zrestartowany po zamknięciu.

Utwórz obraz kontenera

Zakładając, że Twoja aplikacja jest dostępna w / home / me / my-app na tym serwerze, utwórz plik tekstowy Dockerfile w folderze / home / me / my-app o treści podobnej do tej:

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

Utwórz obraz za pomocą następującego polecenia:

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

Uwaga: ostatnim parametrem jest wybranie folderu zawierającego ten plik Docker zamiast samego pliku Docker. Możesz wybrać inny, używając opcji -f .

Uruchom kontener

Użyj tego polecenia do uruchomienia kontenera:

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

To polecenie zakłada, że ​​aplikacja nasłuchuje na porcie 3000 i chcesz, aby była widoczna na porcie 80 twojego hosta.

To z pewnością bardzo ograniczony przykład, ale jest to dobry punkt wyjścia.


0

Jeśli używasz pm2, możesz go użyć z autorestartustawieniem false:

Ekosystem pm2 $

Spowoduje to wygenerowanie próbki 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 uruchom ecosystem.config.js


-1

Ta odpowiedź jest spóźniona na imprezę, ale odkryłem, że najlepszym rozwiązaniem było napisanie skryptu powłoki, który używał zarówno poleceń jak screen -dmSi nohup.

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

Dodaję też >> logfilebit na końcu, dzięki czemu mogę łatwo zapisać instrukcje węzłów console.log().

Dlaczego użyłem skryptu powłoki? Cóż, dodałem również instrukcję if, która sprawdziła, czy node myserver.jsproces już działa.

W ten sposób mogłem utworzyć jedną opcję wiersza poleceń, która pozwala mi kontynuować pracę serwera, a także zrestartować go po wprowadzeniu zmian, co jest bardzo pomocne w rozwoju.


2
Wpadłem na ten problem i jestem całkiem nowy w Linuksie. Jak zrobiłbyś to bez ekranu lub bez?
Craig Norton
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.