it-swarm.com.ru

Как запустить Node.js как фоновый процесс и никогда не умирать?

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

$ node server.js &

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


Правка 1

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

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


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

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

459
murvinlai

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

Nohup node server.js &

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

screen

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

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

496
MK.

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

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

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

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

[email protected]:~$ 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 - это список записей.

135
Alex Povar

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

Специально решение screen/tmux, которое действительно следует рассматривать как решение amateur. 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

Init-скрипты:

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

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

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

112
Victor Schröder

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

$ Nohup node server.js &
[1] 1711
$ disown -h %1
22
myururdurmaz

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

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

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

13
Daniel Gallagher

У меня есть эта функция в моем командном файле Shell, основанная на ответе @ 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
thiagowfx
$ disown node server.js &

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

5
Skynet

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

npm install pm2 -g

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

pm2 start app.js

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

5
Donald Derek

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

4
S.Lott

Для Ubuntu я использую это:

(exec PROG_SH &>/dev/null &)

с уважением

2
David Lopes

Чтобы запустить команду как системную службу в Debian с помощью sysv init:

Скопируйте скрипт-скелет и адаптируйте его под свои нужды, вероятно, все, что вам нужно сделать, это установить некоторые переменные. Ваш скрипт будет наследовать точные значения по умолчанию от /lib/init/init-d-script, если что-то не соответствует вашим потребностям - переопределите это в вашем скрипте. Если что-то пойдет не так, вы можете увидеть детали в источнике /lib/init/init-d-script. Обязательные переменные DAEMON и NAME. Скрипт будет использовать start-stop-daemon для запуска вашей команды, в START_ARGS вы можете определить дополнительные параметры start-stop-daemon для использования.

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

Вот как я запускаю некоторые вещи на Python для моей вики-сайта Викимедиа:

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

Помимо настройки vars мне пришлось переопределить do_stop_cmd, потому что python заменяет исполняемый файл, поэтому служба не остановилась должным образом.

2
user3132194

Помимо крутых решений выше, я бы упомянул также о средствах supervisord и monit, которые позволяют запускать процесс, отслеживать его наличие и запускать, если он умер. С помощью 'monit' вы также можете запускать некоторые активные проверки, такие как проверка, отвечает ли процесс на запрос http.

2
Krzysztof Księżyk

Попробуйте это для простого решения

cmd & выход

0
Hunter Frazier