Как запустить Node.js в качестве фонового процесса и никогда не умирать? - PullRequest
468 голосов
/ 25 января 2011

Я подключаюсь к серверу Linux через замазку SSH. Я пытался запустить его как фоновый процесс, как это:

$ node server.js &

Однако через 2,5 часа терминал становится неактивным и процесс умирает. Могу ли я в любом случае поддержать процесс, даже если терминал отключен?


Редактировать 1

На самом деле, я попытался nohup, но как только я закрываю терминал Putty SSH или отключаю интернет, серверный процесс сразу останавливается.

Что-нибудь, что я должен сделать в Замазке?


Изменить 2 (февраль 2012 г.)

Существует модуль node.js, навсегда . Он будет запускать сервер node.js в качестве службы демона.

Ответы [ 14 ]

1099 голосов
/ 08 августа 2012

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

  1. nohup означает: Не прерывать этот процесс, даже если отключен stty.
  2. > /dev/null означает: stdout идет в / dev / null (это фиктивное устройство, которое не записывает какой-либо вывод).
  3. 2>&1 означает: stderr также идет в стандартный вывод (уже перенаправлен на /dev/null).Вы можете заменить & 1 на путь к файлу для ведения журнала ошибок, например: 2>/tmp/myLog
  4. & в конце означает: запустить эту команду как фоновую задачу.
506 голосов
/ 25 января 2011

Простое решение (если вы не хотите возвращаться к процессу, просто хотите, чтобы он продолжался):

nohup node server.js &

Мощное решение (позволяет повторно подключиться к процессу, если он интерактивный):

screen

Затем можно отсоединиться, нажав Ctrl + a + d, а затем присоединить обратно, выполнив screen -r

Также рассмотрим более новую альтернативу screen, tmux.

137 голосов
/ 28 июня 2013

Вы действительно должны попытаться использовать screen.Это немного сложнее, чем просто набрать nohup long_running &, но понять экран, когда вы уже никогда не вернетесь.

Сначала запустите сеанс экрана:

user@host:~$ screen

Запустите все, что вы хотите:

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

Нажмите Ctrl + A, а затем d.Готово.Ваш сеанс продолжается в фоновом режиме.

Вы можете перечислить все сеансы с помощью screen -ls и присоединить к некоторым с помощью команды screen -r 20673.pts-0.srv, где 0673.pts-0.srv - список записей.

119 голосов
/ 18 марта 2016

Это старый вопрос, но высокий рейтинг в Google.Я почти не могу поверить в ответы с наибольшим количеством голосов, потому что запуск процесса node.js в сеансе экрана с & или даже с флагом nohup - все они - просто обходные пути.

Специально решение screen / tmux, которое действительно следует рассматривать как любительское решение.Screen и Tmux предназначены не для поддержки процессов, а для мультиплексирования сеансов терминала.Это нормально, когда вы запускаете скрипт на своем сервере и хотите отключиться.Но для сервера node.js вы не хотите, чтобы ваш процесс был подключен к терминальной сессии.Это слишком хрупко. Чтобы все работало, вам нужно демонизировать процесс!

Для этого есть множество хороших инструментов.

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

Одно большое преимущество, которое я вижу в пользу PM2, заключается в том, что он может генерировать сценарий запуска системы, чтобы процесс продолжался между перезапусками:

$ pm2 startup [platform]

Где platform может бытьubuntu|centos|redhat|gentoo|systemd|darwin|amazon.

forever.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

Сценарии инициализации :

ЯЯ не буду вдаваться в подробности о том, как написать сценарий инициализации, потому что я не специалист в этой области, и этот ответ будет слишком длинным, но в основном это простые сценарии оболочки, запускаемые событиями ОС.Вы можете прочитать больше об этом здесь

Docker :

Просто запустите свой сервер в Docker-контейнере с параметром -d и voilá , у вас есть демонизированный сервер node.js!

Вот пример Dockerfile (из node.js официальное руководство ):

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" ]

Затем создайте свой образ и запустите свой контейнер:

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

Надеюсь, это поможет кому-нибудь попасть на эту страницу.Всегда используйте подходящий инструмент для работы.Это избавит вас от многих головных болей и лишних часов!

24 голосов
/ 11 апреля 2013

другое решение отказаться от работы

$ nohup node server.js &
[1] 1711
$ disown -h %1
14 голосов
/ 25 января 2011

nohup позволит программе продолжаться даже после смерти терминала. На самом деле у меня были ситуации, когда nohup не позволяет правильно завершить сеанс SSH, поэтому вы должны также перенаправить ввод:

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

В зависимости от настройки nohup может также потребоваться перенаправить стандартный вывод и стандартную ошибку в файлы.

7 голосов
/ 21 сентября 2015

Nohup и screen предлагают отличные световые решения для запуска Node.js в фоновом режиме.Диспетчер процессов Node.js ( PM2 ) - удобный инструмент для развертывания.Установите его с глобальным npm в вашей системе:

npm install pm2 -g

для запуска приложения Node.js в качестве демона:

pm2 start app.js

При желании вы можете связать его с Keymetrics.io SAAS для мониторинга от Unitech.

7 голосов
/ 22 мая 2014

У меня есть эта функция в моем rc-файле оболочки на основе ответа @ Yoichi:

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

Вы можете использовать его следующим образом:

nohup-template "command you would execute here"
6 голосов
/ 30 июля 2014
$ disown node server.js &

Это удалит команду из списка активных задач и отправит команду в фоновый режим

5 голосов
/ 25 января 2011

Вы читали о команде nohup ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...