Как запустить приложение node.js в качестве фоновой службы? - PullRequest
430 голосов
/ 25 октября 2010

С тех пор, как этот пост привлек много внимания на протяжении многих лет, я перечислил лучшие решения для каждой платформы в нижней части этого поста.


Оригинальный пост :

Я хочу, чтобы мой сервер node.js работал в фоновом режиме, то есть: когда я закрываю свой терминал, я хочу, чтобы мой сервер продолжал работать.Я гуглил это и придумал этот учебник , однако он не работает как задумано.Поэтому вместо того, чтобы использовать этот демон-сценарий, я подумал, что просто использовал перенаправление вывода (часть 2>&1 >> file), но это тоже не выходит - я получаю пустую строку в моем терминале, как будто он ожидает вывода / ошибок.

Я также пытался перевести процесс в фоновый режим, но как только я закрываю свой терминал, процесс также завершается.

Так как я могу оставить его работающим, когда я выключаю свойлокальный компьютер?


Лучшие решения :

Ответы [ 24 ]

11 голосов
/ 02 марта 2016

Попробуйте запустить эту команду, если вы используете nohup -

nohup npm start 2>/dev/null 1>/dev/null&

Вы также можете использовать навсегда для запуска сервера

forever start -c "npm start" ./ 

PM2 также поддерживает npm start

pm2 start npm -- start
7 голосов
/ 18 октября 2012

Node.js в качестве фоновой службы в WINDOWS XP

Установка:

  1. Установить WGET http://gnuwin32.sourceforge.net/packages/wget.htm через исполняемый файл установщика
  2. Установить GIT http://code.google.com/p/msysgit/downloads/list через исполняемый файл установщика
  3. Установите NSSM http://nssm.cc/download/?page=download, скопировав nnsm.exe в папку% windir% / system32
  4. Создать c: \ node \ helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
    
  5. Откройте командную консоль и введите следующее (setx, только если установлен Resource Kit)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
    
  6. Отличная групповая штука для создания c: \ node \ ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause
    

Управление услугами:

  • Сами сервисы теперь доступны через Пуск-> Выполнить-> services.msc или через Пуск-> Выполнить-> MSCONFIG-> Службы (и отметьте «Скрыть» Все службы Microsoft ').
  • Скрипт будет префикс каждого узла, созданного с помощью пакетного скрипта, с 'Узел -'
  • Аналогично их можно найти в реестре: " HKLM \ SYSTEM \ CurrentControlSet \ Services \ node-xxxx "
7 голосов
/ 22 марта 2016

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

nodejs scriptname.js & не сработало, потому что nodejs, казалось, сожрал символы &, итак что эта штука не позволила мне продолжать пользоваться терминалом без смерти scriptname.js.

Но я поместил nodejs scriptname.js в файл .sh, и nohup sh startscriptname.sh & сработало.

Определенно нетпроизводственная вещь, но она решает проблему «мне нужно продолжать использовать мой терминал и не хочу запускать 5 разных терминалов».

4 голосов
/ 03 сентября 2014

Если вы используете nodejs на сервере Linux, я думаю, что это лучший способ.

Создайте сценарий службы и скопируйте в /etc/init/nodejs.conf

.

запуск службы: запуск узла sudo servicejs

остановка службы: остановка службы sudo.

Служебный скрипт

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script
4 голосов
/ 27 июня 2017

Июнь 2017 Обновление:
Решение для Linux: (Red Hat).Предыдущие комментарии не работают для меня.Это работает для меня на Amazon Web Service - Red Hat 7. Надеюсь, что это работает для кого-то там.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
3 голосов
/ 21 марта 2014

используйте nssm лучшее решение для Windows, просто скачайте nssm , откройте каталог cmd to nssm и введите

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

, это установит новую службу Windowsкоторый будет указан в services.msc , откуда вы можете запускать или останавливать службу, эта служба будет запускаться автоматически, и вы можете настроить ее перезапуск в случае сбоя.

2 голосов
/ 04 июня 2013

Чтобы завершить различные предлагаемые варианты, вот еще одна: команда daemon в GNU / Linux, о которой вы можете прочитать здесь: http://libslack.org/daemon/manpages/daemon.1.html. (извинения, если это уже упоминалось в одном изкомментарии выше).

1 голос
/ 13 октября 2018

Для людей, использующих более новые версии модуля daemon npm - вам нужно передавать дескрипторы файлов вместо строк:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});
1 голос
/ 26 октября 2010

Проверьте фугу! Помимо запуска большого количества рабочих, вы также можете демонизировать процесс вашего узла!

http://github.com/pgte/fugue

1 голос
/ 07 марта 2017

Я использую tmux для среды разработки нескольких окон / панелей на удаленных хостах.Отсоединить и поддерживать процесс в фоновом режиме очень просто.Посмотрите на tmux

...