Как запустить узел.js приложение в качестве фонового сервиса?
Так как этот пост получил много внимания на протяжении многих лет, я перечислил лучшие решения для каждой платформы в нижней части этого сообщения.
оригинальное сообщение:
Мне нужен мой узел.JS-сервер для запуска в фоновом режиме, т. е.: когда я закрываю свой терминал, я хочу, чтобы мой сервер продолжал работать. Я погуглил это и придумал это учебник, однако это не работает, как предполагалось. Поэтому вместо того, чтобы использовать этот сценарий демона, я думал, что просто используется перенаправление вывода (2>&1 >> file часть), но это тоже не выходит - я получаю пустую строку в своем терминале, как будто он ждет вывода/ошибок.
Я также попытался поместить процесс в фоновом режиме, но как только я закрываю свой терминал, процесс также убивается.
Так как я могу оставить его работать, когда я выключил свой локальный компьютер?
лучшие решения:
Systemd (Linux)
Файл launchd (Mac)
узел-windows (Windows)
PM2 (узел.js)
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 (включая
.servicefile).
вы можете использовать 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вместо этого и предоставляет настраиваемую оболочку узла для более детального контроля над тем, как процесс запускается/останавливается при сбоях. Эти процессы доступны, как и любой другой сервис:
модуль также печет в некотором случае Регистрация:
демонизация вашего скрипта осуществляется с помощью кода. Например:
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
- он имеет действительно полезную функцию мониторинга - > довольно " 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
- престижность идет в Hacksparrow по адресу:http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html для учебника установка узла.js + npm для windows.
- престижность идет к Tatham Oddie в:http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/ для nnsm.реализация ехе.
установка:
- установить 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 только если установлен набор ресурсов)
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 -> сервисы.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
Я использую 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 и т. д. Но, когда дело доходит до твердого контроля и веб-метрики производительности, я нашел начальником чтобы быть самым лучшим. Кроме того, он также полностью открыт.
Edit: однако, я не уверен, если он работает на windows. Я использовал его только на linux.
Это очень просто.
- добавить пакет.JSON в вашем проекте
- добавить имя файла сценария или путь в вашем пакете.JSON Start
- затем просто перейдите в консоль откройте каталог проекта по пути cd / to/directory/
- написать nohup npm start
ниже пакета.JSON пример, который любой может использовать. { "имя": "проект",
"version": "1.0.0", "main": "httpsserver.js", "scripts": { "start": "node httpsserver.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": {}, "devDependencies": {}, "description": "" }



Comments