Как запустить узел.приложение js в качестве фоновой службы?
поскольку этот пост получил много внимания на протяжении многих лет, я перечислил лучшие решения для каждой платформы в нижней части этого сообщения.
оригинальное сообщение:
Мне нужен мой узел.сервер js для работы в фоновом режиме, т. е.: когда я закрываю свой терминал, я хочу, чтобы мой сервер продолжал работать. Я погуглил это и придумал это учебник, однако он не работает как положено. Поэтому вместо того, чтобы использовать сценарий демона, я думал, что просто используется перенаправление вывода (2>&1 >> file
part), но это тоже не выходит - я получаю пустую строку в своем терминале, как будто он ждет вывода/ошибок.
Я также попытался поместить процесс в фоновом режиме, но как только я закрываю свой терминал, процесс также убивается.
Итак, как я могу оставить его работать, когда я выключил свой локальный компьютер?
лучшие решения:
- 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 (включая ).
вы можете использовать Forever, простой инструмент CLI для обеспечения того, чтобы данный скрипт узла работал непрерывно (т. е. навсегда): https://www.npmjs.org/package/forever
обновление - как указано в одном из ответов ниже,PM2 имеет некоторые действительно хорошие функции, отсутствующие навсегда. Подумайте об использовании его.
Оригинальный Ответ
использовать nohup:
nohup node server.js &
редактировать Я хотел добавить,что принятый ответ-это действительно путь. Я использую forever на экземплярах, которые должны оставаться на ногах. Мне нравится делать npm install -g forever
таким образом, он находится в пути узла, а затем просто do forever start server.js
это может быть не принятый способ, но я делаю это с экраном, особенно во время разработки, потому что я могу вернуть его и обмануть с ним, если это необходимо.
screen
node myserver.js
>>CTRL-A then hit D
экран отсоединится и выживет при выходе из системы. Затем вы можете вернуть его обратно, делая screen-r. Нажмите на экран руководства для получения более подробной информации. Вы можете назвать экраны и все такое, если хотите.
обновление 2016: Серия node-windows / mac / linux использует общий API для всех операционных систем, поэтому это абсолютно актуальное решение. Однако; node-linux генерирует файлы инициализации systemv. Поскольку systemd продолжает расти в популярности, это реально лучший вариант на Linux. PR приветствуется, если кто-то хочет добавить поддержку systemd в node-linux: -)
Оригинал Темы:
теперь это довольно старая нить, но узел-windows предоставляет другой способ создания фоновых служб в Windows. Это по мотивам nssm
концепция использования exe
обертка вокруг вашего скрипта узла. Однако, он использует winsw.exe
вместо этого и предоставляет настраиваемую оболочку узла для более детального контроля над тем, как процесс запускается/останавливается при сбоях. Эти процессы доступны, как и любой другой сервис:
модуль также печет в некотором случае logging:
Daemonizing ваш скрипт выполняется через код. Например:
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
(вы должны быть 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
Я просто использую демон модуль 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 для запуска и управления простыми приложениями узла.
Я использую Supervisor для разработки. Это просто работает. Когда вы вносите изменения .JS File Supervisor автоматически перезапускает приложение с загруженными изменениями.
вот ссылка на его страницу Github
установка :
sudo npm install supervisor-g
вы можете легко заставить его смотреть другие расширения с -e. Другая команда, которую я часто использую, - это игнорировать определенные папки.
вы можете использовать nohup и супервизор, чтобы приложение узла работало в фоновом режиме даже после выхода из системы.
sudo nohup супервизор myapp.js&
если вы просто хотите запустить скрипт бесперебойно, пока он не завершится, вы можете использовать nohop
Как уже упоминалось в ответах здесь. Однако ни один из ответов не предоставляет полную команду, которая также регистрирует stdin
и stdout
.
nohup node index.js >> app.log 2>&1 &
- на
>>
средства добавляют к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.
- Kudos идет к 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
-
отличный пакет goodie должен создать 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\система\CurrentControlSet на\услуги\узел-ХХХХ"
принятый ответ, вероятно, Лучший производственный ответ, но для быстрого взлома, выполняющего работу dev, я нашел это:
nodejs scriptname.js &
не сработало, потому что nodejs, казалось, проглотил&, и поэтому вещь не позволила мне продолжать использовать терминал без scriptname.Яш умирает.
но я ставлю nodejs scriptname.js
в a .sh файл, и
nohup sh startscriptname.sh &
работали.
определенно не производственная вещь, но она решает "мне нужно продолжать использовать мой терминал и не хочу начинать 5 разных проблема терминалов.
Если вы используете nodejs в linux server, я думаю, что это лучший способ.
создайте сценарий службы и скопируйте его в /etc/init/nodejs.conf
запустить службу: sudo service NodeJS start
стоп сервис: судо сервис nodejs стоп
сервис скрипт
description "DManager node.js server - Last Update: 2012-08-06"
author "Pedro Muniz - pedro.muniz@geeklab.com.br"
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-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 старт
- затем просто перейдите на консоль, откройте каталог проекта по пути cd / to / directory/
- написать nohup npm start
ниже пакета.В JSON пример, который любой может использовать. { "name": "Project",
"version": "1.0.0",
"main": "httpsserver.js",
"scripts": {
"start": "node httpsserver.js"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {},
"devDependencies": {},
"description": ""
}