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


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

$ node server.js &
, через 2,5 часа терминал становится неактивным, и процесс умирает. Есть ли в любом случае я могу сохранить процесс живым даже с отключенным терминалом?

изменить 1

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

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


Edit 2 (on Feb, 2012)

есть node.js модуль навсегда. Он будет работать узел.JS-сервер как служба демона.

14 451

14 ответов:

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

nohup node server.js &

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

screen

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

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

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

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

вы действительно должны попробовать использовать 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, и прикрепить к некоторым путем

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

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

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

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.

навсегда.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 с и вуаля, у вас есть узел демонизированной.сервер JS!

вот пример Dockerfile (от узла.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

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

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

$ nohup node server.js &
[1] 1711
$ disown -h %1

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

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

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

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

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

вы можете использовать его таким образом:

nohup-template "command you would execute here"
$ disown node server.js &

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

Nohup и экран предлагают большие светлые разрешения к идущему узлу.js на заднем плане. Узел.JS process manager (PM2) является удобным инструментом для развертывания. Установите его с npm глобально в вашей системе:

npm install pm2 -g

для запуска узла.js app как демон:

pm2 start app.js

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

вы читали о nohup?

чтобы запустить команду как системную службу в 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 для моей Wikimedia wiki:

...
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 заменяет исполняемый файл, поэтому служба не остановилась должным образом.

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

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

(exec PROG_SH &> /dev / null &)

в отношении

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

cmd и