Как запустить приложение node.js в качестве фоновой службы?

Поскольку этот пост получил много внимания на протяжении многих лет, я перечислил верхние решения на платформу внизу этой публикации.


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

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

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

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


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

Ответ 1

Копирование собственного ответа. Как запустить приложение Node.js в качестве собственного процесса?

2015: почти каждый дистрибутив Linux поставляется с systemd, что означает, что навсегда, monit и т.д. Больше не нужны - ваша ОС уже обрабатывает эти задачи.

Создайте файл myapp.service (myapp.service заменив "myapp" на ваше имя приложения):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Обратите внимание, если вы новичок в Unix: /var/www/myapp/app.js должен иметь #!/usr/bin/env node в первой строке.

Скопируйте файл службы в систему /etc/systemd/system.

Запустите его с помощью systemctl start myapp.

Включите его для запуска при загрузке с помощью systemctl enable myapp.

Просмотреть журналы с помощью journalctl -u myapp

Это взято из того, как мы развертываем узловые приложения в версии Linux, 2018, в том числе команды для создания AWS/DigitalOcean/Azure CloudConfig для создания серверов Linux/node (включая файл .service).

Ответ 2

Вы можете использовать Forever, простой инструмент CLI для обеспечения непрерывного выполнения заданного node script (т.е. навсегда): https://www.npmjs.org/package/forever

Ответ 3

ОБНОВЛЕНИЕ. Как упоминалось в одном из ответов ниже, PM2 имеет некоторые действительно приятные функциональные возможности, отсутствующие в навсегда. Подумайте об этом.

Оригинальный ответ

Используйте nohup:

nohup node server.js &

EDIT Я хотел добавить, что принятый ответ - действительно способ пойти. Я использую вечно на примерах, которые нужно не спать. Мне нравится npm install -g forever, поэтому он находится в пути node, а затем просто forever start server.js

Ответ 4

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

screen
node myserver.js
>>CTRL-A then hit D

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

Ответ 5

2016 Обновление: Серия node -windows/mac/linux использует общий API для всех операционных систем, поэтому это абсолютно подходящее решение. Однако; node -linux генерирует файлы инициализации systemv. Поскольку systemd продолжает расти в популярности, это реалистично лучший вариант для Linux. PR приветствуется, если кто-то хочет добавить поддержку systemd в node -linux: -)

Оригинальная тема:

Теперь это довольно старый поток, но node-windows предоставляет другой способ создания фоновых сервисов в Windows, Он основан на концепции nssm использования обертки exe вокруг вашего node script. Однако; вместо этого он использует winsw.exe и предоставляет настраиваемую оболочку node для более детального контроля за тем, как процесс запускается/останавливается при сбоях. Эти процессы доступны, как и любая другая служба:

enter image description here

Модуль также запекает некоторые регистрации событий:

enter image description here

Демонстрация вашего script осуществляется с помощью кода. Например:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

Модуль поддерживает такие вещи, как перезапуск капиляции (так что плохой скрипт не шланги вашего сервера) и растущие интервалы времени между перезапусками.

Так как службы node -windows запускаются, как и любые другие, можно управлять/контролировать службу с помощью любого программного обеспечения, которое вы уже используете.

Наконец, нет зависимостей make. Другими словами, будет работать простой npm install -g node-windows. Вам не нужна Visual Studio,.NET или node -gyp magic, чтобы установить это. Кроме того, он лицензировал MIT и BSD.

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

Ответ 6

UPDATE: я обновлен, чтобы включить последнее из pm2:

для многих случаев использования, использование службы systemd является самым простым и наиболее подходящим способом управления процессом node. для тех, на которых запущены многочисленные процессы node или автономные микросервисы node в одной среде, pm2 - более полнофункциональный инструмент.

https://github.com/unitech/pm2

http://pm2.io

  • у него есть действительно полезная функция мониторинга → довольно "gui" для мониторинга командной строки нескольких процессов с помощью pm2 monit или списка процессов с помощью pm2 list
  • организованное управление журналом → pm2 logs
  • другие вещи:
    • Конфигурация поведения
    • Поддержка исходной карты.
    • Совместимость с PaaS
    • Смотреть и перезагружать
    • Модульная система
    • Максимальная перезагрузка памяти
    • Режим кластеров
    • Горячая перезагрузка
    • Рабочий процесс разработки
    • Скрипты запуска
    • Автозаполнение
    • Рабочий процесс развертывания
    • Контроль ключевых показателей
    • API

Ответ 7

Если вы используете OSX, самый простой способ создать настоящий системный процесс - использовать launchd для его запуска.

Создайте такой plist и поместите его в /Library/LaunchDaemons с именем top-level-domain.your-domain.application.plist (вам нужно быть root при его размещении):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Когда это будет сделано, введите это (как root):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

и вы работаете.

И вы все равно будете работать после перезагрузки.

Для других опций в plist посмотрите man-страницу здесь: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

Ответ 8

Я просто использую модуль daemon npm:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

В последнее время я также использую mon (1) из TJ Holowaychuk, чтобы запускать и управлять простыми приложениями node.

Ответ 9

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

Здесь ссылка на страницу Github

Установить:

sudo npm install supervisor -g

Вы можете легко заставить его смотреть другие расширения с -e. Другая используемая мною команда - -i игнорировать определенные папки.

Вы можете использовать nohup и supervisor, чтобы приложение node выполнялось в фоновом режиме даже после выхода из системы.

sudo nohup supervisor myapp.js &

Ответ 10

Если вы просто хотите запустить script без прерывания до его завершения, вы можете использовать nohop, как уже упоминалось в ответах здесь. Однако ни один из ответов не дает полной команды, которая также регистрирует stdin и stdout.

nohup node index.js >> app.log 2>&1 &
  • >> означает добавление к app.log.
  • 2>&1 гарантирует, что ошибки также отправляются на stdout и добавляются к app.log.
  • Окончание & гарантирует, что ваш текущий терминал отключен от команды, чтобы продолжить работу.

Если вы хотите запустить сервер node (или что-то, что должно начаться при перезагрузке сервера), вы должны использовать systemd/systemctl.

Ответ 11

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

Установка:

  • Установите WGET http://gnuwin32.sourceforge.net/packages/wget.htm через исполняемый файл установщика
  • Установите GIT http://code.google.com/p/msysgit/downloads/list через исполняемый файл установщика
  • Установите NSSM http://nssm.cc/download/?page=download путем копирования nnsm.exe в папку% windir%/system32
  • Создать 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/");
    
  • Откройте консоль команд и введите следующее (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
    
  • Отличный пакетный способ - создать c:\ node\ServiceMe.cmd

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

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

  • Теперь сами сервисы доступны через Start- > Run- > services.msc или через Start- > Run- > MSCONFIG- > Сервисы (и проверьте "Скрыть" Все службы Microsoft ").
  • script будет префикс каждого node, выполненного с помощью пакета script с node - '.
  • Кроме того, они могут быть найдены в реестре: " HKLM\SYSTEM\CurrentControlSet\Services\ node -xxxx"

Ответ 12

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

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

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

Определенно, это не производственная штука, но она решает "Мне нужно продолжать использовать мой терминал и не пытаться запускать 5 разных терминалов".

Ответ 13

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

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

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

forever start -c "npm start" ./ 

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

pm2 start npm -- start

Ответ 14

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

Создайте сервис script и скопируйте в /etc/init/nodejs.conf

запуск службы: sudo service nodejs start

остановить службу: sudo service nodejs stop

Sevice script

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - [email protected]"

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

Ответ 15

используйте nssm лучшее решение для Windows, просто скачайте nssm, откройте cmd в каталог 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, после чего вы можете запустить или остановить службу, эта служба будет автоматически запущена, и вы сможете настроить ее перезагрузку, если она не удалась.

Ответ 16

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

Ответ 17

Июнь 2017 г. Обновление:
Решение для Linux: (Красная шляпа). Предыдущие комментарии не работают для меня. Это работает для меня на 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

Ответ 18

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

http://github.com/pgte/fugue

Ответ 19

кто-нибудь заметил тривиальное ошибочное положение "2 > & 1"?

2>&1 >> file

должен быть

>> file 2>&1

Ответ 20

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

Ответ 21

Этот ответ довольно поздний для партии, но я нашел, что лучшим решением было написать оболочку script, которая использовала команды screen -dmS и nohup.

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Я также добавляю бит >> logfile в конец, поэтому я могу легко сохранить инструкции node console.log().

Почему я использовал оболочку script? Я также добавил в оператор if, который проверял, был ли уже запущен процесс node myserver.js.

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

Ответ 22

PM2 является менеджером производственных процессов для приложений Node.js со встроенным балансировщиком нагрузки. Это позволяет сохранять приложения навсегда, перезагружать их без простоев и облегчать общие задачи администрирования системы. https://github.com/Unitech/pm2

Ответ 23

Я удивлен, что никто не упомянул Guvnor

Я пробовал навсегда, pm2 и т.д. Но когда дело доходит до твердого контроля и метрики производительности на веб-сайте, я нашел Guvnor быть безусловно лучшим. Кроме того, он также полностью открыт.

введите описание изображения здесь

Изменить: Однако я не уверен, работает ли он в окнах. Я использовал его только в linux.

Ответ 24

Для людей, использующих более новые версии модуля 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
});

Ответ 25

Это очень просто.

  • Добавить package.json в свой проект
  • Добавьте script имя файла или путь в свой пакет. JSON Начать
  • Затем просто перейдите в консоль, откройте каталог проекта с помощью cd path/to/directory/
  • Записать nohup npm start

Ниже приведен пример Package.JSON, который может использовать любой пользователь.   {      "name": "Project",

  "version": "1.0.0",

  "main": "httpsserver.js",

  "scripts": {

    "start": "node httpsserver.js"
  },

  "keywords": [],

  "author": "",

  "license": "ISC",

  "dependencies": {},

  "devDependencies": {},

  "description": ""

}