Jak uruchomić Node.js jako tło procesu i nigdy nie umrzeć?

Łączę się z serwerem linux przez putty SSH. Próbowałem uruchomić go jako proces w tle, taki jak ten:

$ node server.js &

Jednak po 2,5 godzinie terminal staje się nieaktywny i proces umiera. Czy w ogóle mogę utrzymać proces przy życiu, nawet po odłączeniu terminala?


Edit 1

Właściwie próbowałem nohup, ale jak tylko zamknę Terminal Putty SSH lub odłączę internet, proces serwera zatrzymuje się od razu.

Czy jest coś, co mam do szpachlowania?


Edit 2 (on Feb, 2012)

Istnieje node.js moduł, na zawsze . Uruchomi węzeł.serwer js jako usługa demona.

Author: Victor Schröder, 2011-01-25

14 answers

Proste rozwiązanie (jeśli nie jesteś zainteresowany powrotem do procesu, po prostu chcesz, aby nadal działał):

nohup node server.js &

Rozwiązanie to pozwala na ponowne połączenie się z procesem, jeśli jest on interaktywny.]}

screen

Możesz następnie odłączyć, naciskając Ctrl + a + d, a następnie podłączyć z powrotem, uruchamiając screen -r

Rozważ również nowszą alternatywę dla ekranu, tmux.

 488
Author: MK.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 21:22:07

nohup node server.js > /dev/null 2>&1 &

  1. nohup oznacza: nie przerywaj tego procesu, nawet gdy stty jest wycięte wyłącz.
  2. > /dev/null oznacza: stdout przechodzi do /dev / null (który jest atrapą urządzenie, które nie rejestruje żadnego wyjścia).
  3. 2>&1 oznacza: stderr przechodzi również do stdout (który jest już przekierowany na /dev/null). Możesz zastąpić &1 ścieżką pliku, aby prowadzić dziennik błędów, np.: 2>/tmp/myLog
  4. & na końcu oznacza: uruchom to polecenie jako zadanie w tle.
 1068
Author: Yoichi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-29 08:33:23

Naprawdę powinieneś spróbować użyć screen. Jest to nieco bardziej skomplikowane niż tylko robienie nohup long_running &, ale zrozumienie ekranu raz już nigdy nie wrócisz.

Rozpocznij sesję ekranu na początku:

user@host:~$ screen

Uruchom cokolwiek chcesz:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Naciśnij ctrl + A, a następnie d. gotowe. Twoja sesja trwa w tle.

Możesz wyświetlić listę wszystkich sesji według screen -ls i dołączyć do niektórych za pomocą screen -r 20673.pts-0.srv polecenia, gdzie 0673.pts-0.srv to lista wpisów.

 133
Author: Alex Povar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-28 06:40:49

To stare pytanie, ale jest wysoko w rankingu Google. Prawie nie mogę uwierzyć w najwyżej głosowane odpowiedzi, bo uruchamianie węzła.proces js wewnątrz sesji ekranowej, z flagą & lub nawet z flagą nohup -- wszystkie z nich -- są tylko obejściami.

Szczególnie rozwiązanie screen/tmux, które naprawdę powinno być uważane za rozwiązanie amator . Screen i Tmux nie są przeznaczone do utrzymywania uruchomionych procesów, ale do multipleksowania sesji terminala. Jest dobrze, kiedy jesteś uruchamianie skryptu na serwerze i chcesz się rozłączyć. Ale dla węzła.js server nie chcesz, aby twój proces był dołączony do sesji terminala. To zbyt delikatne. aby wszystko działało, musisz daemonizować proces!

Istnieje wiele dobrych narzędzi do tego.

PM2: http://pm2.keymetrics.io/

# basic usage
$ npm install pm2 -g
$ pm2 start server.js

# you can even define how many processes you want in cluster mode:
$ pm2 start server.js -i 4

# you can start various processes, with complex startup settings
# using an ecosystem.json file (with env variables, custom args, etc):
$ pm2 start ecosystem.json

Jedną dużą zaletą widzę na korzyść PM2 jest to, że może generować skrypt startowy systemu, aby proces persist między restartami:

$ pm2 startup [platform]

Gdzie platform może być ubuntu|centos|redhat|gentoo|systemd|darwin|amazon.

Na zawsze.js: https://github.com/foreverjs/forever

# basic usage
$ npm install forever -g
$ forever start app.js

# you can run from a json configuration as well, for
# more complex environments or multi-apps
$ forever start development.json

Skrypty Init :

Nie wdaję się w szczegóły, jak napisać skrypt init, ponieważ nie jestem ekspertem w tym temacie i ta odpowiedź byłaby zbyt długa, ale zasadniczo są to proste skrypty powłoki, wyzwalane przez zdarzenia systemu operacyjnego. Możesz przeczytać więcej na ten temat tutaj

Docker :

Po prostu uruchom serwer w kontenerze dokera z opcją -d i, voilá , masz demonizowany węzeł.serwer js!

Oto przykładowy plik Dockerfile (z node.js oficjalny przewodnik):

FROM node:argon

# Create app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Install app dependencies
COPY package.json /usr/src/app/
RUN npm install

# Bundle app source
COPY . /usr/src/app

EXPOSE 8080
CMD [ "npm", "start" ]

Następnie zbuduj swój obraz i uruchom kontener:

$ docker build -t <your username>/node-web-app .
$ docker run -p 49160:8080 -d <your username>/node-web-app

Mam nadzieję, że to pomoże komuś wylądować na tej stronie. Zawsze używaj odpowiedniego narzędzia do pracy. Zaoszczędzi ci to wielu bólów głowy i więcej godziny!

 107
Author: Victor Schröder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-09 08:29:25

Inne rozwiązanie]}

$ nohup node server.js &
[1] 1711
$ disown -h %1
 21
Author: myururdurmaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-11 08:39:12

nohup pozwoli programowi kontynuować nawet po śmierci terminala. W rzeczywistości miałem sytuacje, w których nohup uniemożliwia poprawne zakończenie sesji SSH, więc powinieneś również przekierować wejście:

$ nohup node server.js </dev/null &

W zależności od konfiguracji nohup może być również konieczne przekierowanie standardowego wyjścia i standardowego błędu do plików.

 12
Author: Daniel Gallagher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 17:56:29

Mam tę funkcję w moim pliku shell rc, na podstawie odpowiedzi @Yoichi:

nohup-template () {
    [[ "$1" = "" ]] && echo "Example usage:\nnohup-template urxvtd" && return 0
    nohup "$1" > /dev/null 2>&1 &
}

Możesz go użyć w ten sposób:

nohup-template "command you would execute here"
 5
Author: thiagowfx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-18 02:44:28
$ disown node server.js &

Usunie polecenie z listy aktywnych zadań i wyśle je do tła

 4
Author: Skynet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-07 11:04:47

Nohup i screen oferują świetne rozwiązania świetlne dla uruchomionego węzła.js w tle. Węzeł.js process manager (PM2 ) to przydatne narzędzie do wdrażania. Zainstaluj go z npm globalnie na swoim systemie:

npm install pm2 -g

Aby uruchomić węzeł.aplikacja js jako demon:

pm2 start app.js

Możesz opcjonalnie połączyć go z Keymetrics.io monitoring SAAS firmy Unitech.

 4
Author: Donald Derek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 18:44:43

Czytałeś o komendzie nohup ?

 3
Author: S.Lott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-25 17:54:55

Aby uruchomić polecenie jako usługę systemową w Debianie z sysv init:

Skopiuj skrypt szkieletu i dostosuj go do swoich potrzeb, prawdopodobnie wystarczy ustawić kilka zmiennych. Twój skrypt odziedziczy fine defaults z /lib/init/init-d-script, jeśli coś nie pasuje do Twoich potrzeb-zastąp to w swoim skrypcie. Jeśli coś pójdzie nie tak możesz zobaczyć szczegóły w source /lib/init/init-d-script. Obowiązkowe var to DAEMON i NAME. Skrypt użyje start-stop-daemon do uruchomienia polecenia, w START_ARGS można zdefiniować dodatkowe parametry start-stop-daemon do użycia.

cp /etc/init.d/skeleton /etc/init.d/myservice
chmod +x /etc/init.d/myservice
nano /etc/init.d/myservice

/etc/init.d/myservice start
/etc/init.d/myservice stop

W ten sposób uruchamiam kilka pythonowych rzeczy na mojej wiki wikimedia:

...
DESC="mediawiki articles converter"
DAEMON='/home/mss/pp/bin/nslave'
DAEMON_ARGS='--cachedir /home/mss/cache/'
NAME='nslave'
PIDFILE='/var/run/nslave.pid'
START_ARGS='--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'

export PATH="/home/mss/pp/bin:$PATH"

do_stop_cmd() {
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 \
        $STOP_ARGS \
        ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    rm -f $PIDFILE
    return $RETVAL
}

Poza ustawieniem vars musiałem nadpisać do_stop_cmd ponieważ python zastępuje plik wykonywalny, więc usługa nie zatrzymała się poprawnie.

 1
Author: user3132194,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-07 06:12:34

Oprócz fajnych rozwiązań powyżej wspomniałbym również o narzędziach supervisord i monit, które pozwalają rozpocząć proces, monitorować jego obecność i uruchomić go, jeśli umrze. Z 'monit' możesz również uruchomić kilka aktywnych sprawdzeń, takich jak sprawdź, czy proces odpowiada na żądanie http

 1
Author: Krzysztof Księżyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 20:21:41

Dla Ubuntu używam tego:

(Exec PROG_SH & > / dev / null&)

Pozdrawiam

 1
Author: David Lopes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-18 17:07:01

Spróbuj tego prostego rozwiązania

cmd & exit

 -1
Author: Hunter Frazier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 17:12:48