Как запустить узел.js как фоновый процесс и никогда не умрет?
я подключаюсь к серверу linux через putty SSH. Я попытался запустить его в качестве фонового процесса, как это:
$ node server.js &
, через 2,5 часа терминал становится неактивным, и процесс умирает. Есть ли в любом случае я могу сохранить процесс живым даже с отключенным терминалом?
изменить 1
на самом деле, я пробовал nohup
, но как только я закрываю терминал Putty SSH или отключаю свой интернет, серверный процесс сразу останавливается.
есть ли что-нибудь, что я должен сделать в замазке?
Edit 2 (on Feb, 2012)
есть node.js
модуль навсегда. Он будет работать узел.JS-сервер как служба демона.
14 ответов:
простое решение (если вы не заинтересованы в возвращении к процессу, просто хочу, чтобы продолжать работать):
nohup node server.js &
мощное решение (позволяет подключиться к процессу, если он является интерактивным):
screen
затем вы можете отсоединить, нажав Ctrl+a+d, а затем прикрепить обратно, запустив
screen -r
также рассмотрите более новую альтернативу экрану, tmux.
nohup node server.js > /dev/null 2>&1 &
nohup
означает: не завершайте этот процесс, даже если stty вырезан выключено.> /dev/null
означает: stdout переходит в /dev / null (который является фиктивным устройство не записывает никаких выходных данных).2>&1
означает: стандартный вывод и стандартный вывод (который уже перенаправляется на/dev/null
). Вы можете заменить &1 путем к файлу, чтобы сохранить журнал ошибок, например:2>/tmp/myLog
&
в конце означает: выполнить команду в фоновом режиме.
вы действительно должны попробовать использовать
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
позволит программе продолжаться даже после того, как терминал умрет. У меня на самом деле были ситуации, когда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-запрос