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



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





оригинальное сообщение:



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



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



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





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





  • Systemd (Linux)


  • Файл launchd (Mac)


  • узел-windows (Windows)


  • PM2 (узел.js)

1565   24  

24 ответов:

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

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

сделать 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 edition, который также включает команды для создания AWS / DigitalOcean / Azure CloudConfig для построения серверов Linux/node (включая .service file).

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

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

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

использовать команды nohup:

nohup node server.js &

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

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

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

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

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

Оригинал Темы:

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

enter image description here

модуль также печет в некотором случае Регистрация:

enter image description here

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

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.

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

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

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

https://github.com/unitech/pm2

http://pm2.io

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

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

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

<?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>

когда закончите, выдайте это (как корень):

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

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

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

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

Я просто использую демон модуль 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
});

в последнее время я также использую ПН(1) С TJ Holowaychuk для запуска и управления простыми приложениями узла.

Я использую Супервизор для развития. Это просто работает. Когда вы вносите изменения .JS file Supervisor автоматически перезапускает ваше приложение с этими загруженными изменениями.

вот ссылка на его страницу Github

установка :

sudo npm install supervisor-g

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

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

sudo nohup supervisor myapp.js &

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

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

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

узел.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 только если установлен набор ресурсов)

    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
    

Управление Службами:

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

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

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

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

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

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

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

start service: sudo service nodejs start

остановить службу командой: sudo обслуживание nodejs остановки

сервис скрипт

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

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

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

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

forever start -c "npm start" ./ 

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

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

Июнь 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

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

http://github.com/pgte/fugue

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

2>&1 >> file

должно быть

>> file 2>&1

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

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

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

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

почему я использую скрипт? Ну я также добавил В оператор if, который проверил, чтобы увидеть, если

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

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

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

enter image description here

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

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

  1. добавить пакет.JSON в вашем проекте
  2. добавить имя файла сценария или путь в вашем пакете.JSON Start
  3. затем просто перейдите в консоль откройте каталог проекта по пути cd / to/directory/
  4. написать nohup npm start

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

  "version": "1.0.0",

  "main": "httpsserver.js",

  "scripts": {

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

  "keywords": [],

  "author": "",

  "license": "ISC",

  "dependencies": {},

  "devDependencies": {},

  "description": ""

}

Comments

    Ничего не найдено.