2010-10-25 4 views
336

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


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

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

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

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


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

+2

Я думаю, что он имел в виду, чтобы закрыть его локальную систему –

+37

он имел в виду закрытие SSH сессия завершает задачу – thedjaney

+0

@thedjaney именно –

ответ

247

Копирование мой собственный ответ от How do I run a Node.js application as its own process?

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

Сделать myapp.service файл (заменяющий «MYAPP» с именем вашего приложения, очевидно):

[Unit] 
Description=My app 

[Service] 
ExecStart=/var/www/myapp/app.js 
Restart=always 
User=nobody 
# Note RHEL/Fedora uses 'nobody', Debian/Ubuntu uses 'nogroup' 
Group=nobody 
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

Более подробной информацией по адресу: How we deploy node apps on Linux, 2018 edition

+2

Upstart, если доступно, также является хорошим решением. в любом случае, вы не должны полагаться на процесс nodejs, чтобы поддерживать демон вашего nodejs. Это единственная задача для ОС исключительно. killall nodejs и навсегда ушел .... – 131

+10

Обратите внимание, что также можно запускать службы systemd как пользователь. См. Например [этот учебник] (https://wiki.archlinux.org/index.php/Systemd/User). Вы можете поместить свой файл службы в '~/.config/systemd/user', запустить его с помощью' systemctl --user start myapp', включить его с помощью 'systemctl --user enable myapp'. – cdauth

+5

Спасибо за этот ответ.Это то, что я хочу чистым и понятным – bmavus

48

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

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

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

+4

Возможно, не принятый способ, но все же очень полезно, спасибо! –

+2

Кроме того, tmux хорош. Работает как экран (CTRL-B по умолчанию вместо CTRL-A, но настраивается). Tmux имеет панели (разделенные экраны). – snapfractalpop

+1

Экран имеет панели тоже –

178

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

Оригинал ответа

Использование nohup:

nohup node server.js & 

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

+114

классная часть, которую нужно знать: 'nohup' означает' no hangup', который исходит из старых дней, где вы хотели, чтобы вы сохраняли процесс, когда вы «зависаете» с вашим модемом. – jAndy

+1

в настоящее время это скорее имя сигнала 1, который обрабатывает получение, чтобы предупредить, что пользователь закрыл оболочку (или потерял соединение с модемом, конечно: P) – lapo

+7

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

1

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

http://github.com/pgte/fugue

224

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

+4

С последним узлом я не смог заставить его остановить приложение с помощью имени сценария (ошибка) - также - вообще-то плохое поведение (было на OS-X) - все построено из источника, как ни странно. Оставленные вещи в плохом состоянии не наполнили меня уверенностью. –

+4

Хотя nohup делает трюк, навсегда это лучшее решение, поскольку оно демонизирует процесс. Отличный инструмент! –

+4

Просто, кстати, здесь доступно более простое учебное пособие: [Держите узел.js server up with Forever] (http://blog.nodejitsu.com/keep-a-nodejs-server-up-with-forever) – kehers

0

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

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

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

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

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

+0

Пожалуйста. Нет экранных решений. –

+1

Я столкнулся с этой проблемой и довольно новичок в Linux. Как бы вы сделали это без экрана или nohup? –

13

Я просто с помощью демона модуля НПМ:

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

7

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

    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: \ узел \ ServiceMe.cmd

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

Management Service:

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

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

Оригинальной Тема:

Это довольно старая нить теперь, но node-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(); 

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

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

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

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

+6

Теперь я портировал это на [node-mac] (https://github.com/coreybutler/node-mac), предоставляя ту же функциональность в OSX. – Corey

+7

Я также портировал это на [node-linux] (http://github.com/coreybutler/node-linux) – Corey

+1

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

2

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

23

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

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

https://github.com/unitech/pm2

http://pm2.io

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

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

Here's a link to its Github page

Установка:

Судо НПМ установки супервизор -g

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

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

Судо поЬир руководитель myapp.js &

+1

Я думаю, что на практике супервизор - лучший вариант, чем большинство модулей демонов, особенно используемый в сочетании с webhook для проверки обновлений. –

+0

I второй этот. Если вы измените файлы PHP, перезапустите сервер Apache или Nginx? Точно нет. Тогда зачем беспокоиться о перезагрузке всего сервера Node.js, просто измените одну строку кода? Хотя это может и не быть лучшим решением, при аренде с Supervisor вам не нужно беспокоиться о перезапуске (на самом деле перезапуск все еще происходит). –

2

использование nssm лучшее решение для окон, просто скачать nssm, откройте ЦМД в каталог NSSM и введите

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

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

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

4

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

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

начала службы: Судо nodejs сервис запуска

остановка службы: SUDO обслуживание nodejs остановить

SEVICE сценарий

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 
13

Если вы используете 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

+0

Какой пользователь будет выполнять эту службу? Есть ли способ установить пользователя? – rjmunro

1

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

+0

проблемы с серьезной памятью! go for phusion + nginx –

1

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

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

enter image description here

Edit: Тем не менее, я не уверен, если он работает на окнах. Я использовал его только в Linux.

+0

не работает на окнах. – user2834172

+0

Кажется, простоя с 2017 года. Сбой сборки. В прошлом году код не проталкивался. Под вопросом. – toszter

1

Кто-нибудь заметил тривиальный ошибочный элемент позиции "2> & 1"?

2>&1 >> file 

должен быть

>> file 2>&1 
2

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

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

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

forever start -c "npm start" ./ 
5

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

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

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

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

1

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

0

Его очень просто.

  1. Добавить package.json в проекте
  2. Добавить имя файла сценария или путь в вашем Package.JSON Start
  3. Тогда просто перейдите в консоль открыть каталог проекта по пути кд/в каталог//
  4. начать запись поЬир НПМ

Ниже приводится Package.JSON образец, который каждый может использовать. { "имя": "Проект",

"version": "1.0.0", 

    "main": "httpsserver.js", 

    "scripts": { 

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

    "keywords": [], 

    "author": "", 

    "license": "ISC", 

    "dependencies": {}, 

    "devDependencies": {}, 

    "description": "" 

} 
2

июня 2017 Обновление:
Solution для 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 
5

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

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

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

Смежные вопросы