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 >> file
część), 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 :
- Systemd (Linux)
- Uruchomiony (Mac)
- węzły-okna (Windows)
- PM2 (Node.js)
Odpowiedzi:
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.service
plik (oczywiście zastępując „myapp” nazwą aplikacji):Uwaga: jeśli dopiero zaczynasz korzystać z Uniksa:
/var/www/myapp/app.js
powinien być#!/usr/bin/env node
w 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
.service
pliku).źródło
~/.config/systemd/user
, uruchomić go za pomocąsystemctl --user start myapp
, włączyć za pomocąsystemctl --user enable myapp
.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
źródło
forever start /path/to/yourApp.js
w skrypcie uruchamiania serwera.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 :
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
źródło
nohup
oznacza,no hangup
która pochodzi z dawnych czasów, kiedy chciałeś, aby proces był aktywny, gdy „rozłączasz” modem.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.
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.
źródło
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
nssm
koncepcji użyciaexe
opakowania wokół skryptu węzła. Jednak; używawinsw.exe
zamiast 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:Moduł piecze także przy logowaniu niektórych zdarzeń:
Daemonizacja skryptu odbywa się za pomocą kodu. Na przykład:
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
make
zależności. Innymi słowy, prostenpm install -g node-windows
bę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.
źródło
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
pm2 monit
lub listy procesów za pomocąpm2 list
pm2 logs
źródło
Jeśli używasz OSX, najłatwiejszym sposobem na stworzenie prawdziwego procesu systemowego jest
launchd
jego 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):Po zakończeniu wydaj (jako root):
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
źródło
Jeśli chcesz po prostu uruchomić skrypt nieprzerwanie, dopóki się nie zakończy, możesz użyć tego,
nohup
jak już wspomniano w odpowiedziach tutaj. Jednak żadna z odpowiedzi nie zawiera pełnego polecenia, które również rejestrujestdin
istdout
.>>
środki dołączyć doapp.log
.2>&1
upewnia się, że błędy są również wysyłanestdout
i dodawane doapp.log
.&
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 .
źródło
Spróbuj uruchomić to polecenie, jeśli używasz nohup -
Możesz także użyć na zawsze, aby uruchomić serwer
PM2 obsługuje również
npm start
źródło
pm2 start npm -- start
Po prostu używam demona npm modułu:
Ostatnio używam również mon (1) z TJ Holowaychuk do uruchamiania prostych aplikacji węzłów i zarządzania nimi.
źródło
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ć :
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.
źródło
Node.js jako usługa działająca w tle w WINDOWS XP
Instalacja:
Utwórz c: \ node \ helloworld.js
Otwórz konsolę poleceń i wpisz następujące polecenie (setx tylko, jeśli zainstalowany jest zestaw zasobów)
Sprytną partią jest tworzenie c: \ node \ ServiceMe.cmd
Zarządzanie usługami:
źródło
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.js
wstawiłem plik .sh inohup 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”.
źródło
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
źródło
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ś.
źródło
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
co to robi. Czy możesz podać mi więcej szczegółów. Nie jestem pewien, ale myślę, że przekierowuje ruch z80
do8080
którego węzeł serwer słucha, prawda?użyj nssm najlepszego rozwiązania dla systemu Windows, po prostu pobierz nssm , otwórz katalog cmd i nssm i wpisz
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.
źródło
Aby zaokrąglić różne sugerowane opcje, oto jeszcze jedno:
daemon
polecenie w GNU / Linux, o którym możesz przeczytać tutaj: http://libslack.org/daemon/manpages/daemon.1.html . (przeprasza, jeśli zostało to już wspomniane w jednym z powyższych komentarzy).źródło
Sprawdź fugę! Oprócz uruchomienia wielu pracowników, możesz również zdemonizować proces węzła!
http://github.com/pgte/fugue
źródło
czy ktoś zauważył trywialny błąd co do pozycji „2> i 1”?
Powinien być
źródło
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
źródło
Dla osób korzystających z nowszych wersji modułu demona npm - musisz przekazać deskryptory plików zamiast ciągów:
źródło
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
źródło
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.
Edycja: Nie jestem jednak pewien, czy działa w systemie Windows. Użyłem go tylko na Linuksie.
źródło
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:
Utwórz obraz za pomocą następującego polecenia:
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:
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.
źródło
Jeśli używasz pm2, możesz go użyć z
autorestart
ustawieniemfalse
:Spowoduje to wygenerowanie próbki
ecosystem.config.js
:źródło
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 -dmS
inohup
.Dodaję też
>> logfile
bit na końcu, dzięki czemu mogę łatwo zapisać instrukcje węzłówconsole.log()
.Dlaczego użyłem skryptu powłoki? Cóż, dodałem również instrukcję if, która sprawdziła, czy
node myserver.js
proces 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.
źródło