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

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


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

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

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

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


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

Ответы [ 24 ]

353 голосов
/ 14 марта 2015

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

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

Создайте файл 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 / узлов ( включая файл .service).

238 голосов
/ 18 марта 2011

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

204 голосов
/ 25 октября 2010

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

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

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

nohup node server.js &

РЕДАКТИРОВАТЬ Я хотел бы добавить, что принятый ответ действительно путь. Я использую вечно в случаях, когда нужно не спать. Мне нравится делать npm install -g forever, чтобы он находился в пути к узлу, а затем просто сделать forever start server.js

63 голосов
/ 25 октября 2010

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

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

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

58 голосов
/ 25 марта 2013

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

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

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

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

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

26 голосов
/ 09 июня 2013

ОБНОВЛЕНИЕ : я обновил, чтобы включить последние новости с pm2:

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

https://github.com/unitech/pm2

http://pm2.io

  • имеет действительно полезную функцию мониторинга -> симпатичный графический интерфейс для мониторинга нескольких процессов с помощью pm2 monit или списка процессов с pm2 list
  • организовано ведение журнала -> pm2 logs
  • другие вещи:
    • Настройка поведения
    • Поддержка карт источников
    • PaaS совместимый
    • Watch & Reload
    • Модульная система
    • Макс. Перезагрузка памяти
    • Кластерный режим
    • Горячая перезагрузка
    • Рабочий процесс разработки
    • Скрипты запуска
    • Автозаполнение
    • Рабочий процесс развертывания
    • мониторинг ключевых параметров
16 голосов
/ 23 сентября 2014

Если вы работаете с 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 посмотрите страницу руководства здесь: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

13 голосов
/ 24 июля 2012

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

13 голосов
/ 13 октября 2017

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

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

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

12 голосов
/ 16 июля 2013

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

Вот ссылка на страницу Github

Установка:

sudo npm install supervisor -g

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

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

sudo nohup supervisor myapp.js &

...