Так как этот пост привлек много внимания на протяжении многих лет, я перечислил лучшие решения для каждой платформы в нижней части этого поста.
Исходное сообщение :
Я хочу, чтобы мой сервер node.js работал в фоновом режиме, то есть: когда я закрываю свой терминал, я хочу, чтобы мой сервер продолжал работать. Я гуглил это и придумал этот урок , однако он не работает как задумано. Поэтому вместо того, чтобы использовать этот демон-сценарий, я подумал, что я просто использовал перенаправление вывода ( 2>&1 >> file
часть), но это тоже не выходит - я получаю пустую строку в моем терминале, как будто он ожидает вывода / ошибок.
Я также пытался перевести процесс в фоновый режим, но как только я закрываю свой терминал, процесс также прекращается.
Так, как я могу оставить это работающим, когда я выключаю свой локальный компьютер?
Лучшие решения :
Ответы:
Копирование моего собственного ответа из Как я могу запустить приложение Node.js как его собственный процесс?
Ответ 2015 года : почти каждый дистрибутив Linux поставляется с systemd, что означает, что навсегда, monit, PM2 и т. Д. Больше не нужны - ваша ОС уже выполняет эти задачи .
Создайте
myapp.service
файл (очевидно, заменив «myapp» именем вашего приложения):Обратите внимание, если вы новичок в 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
файл).источник
~/.config/systemd/user
, запустить его сsystemctl --user start myapp
, включить его сsystemctl --user enable myapp
.Вы можете использовать Forever, простой инструмент CLI для обеспечения непрерывной работы данного скрипта узла (т. Е. Навсегда): https://www.npmjs.org/package/forever
источник
forever start /path/to/yourApp.js
в скрипте запуска вашего сервера.ОБНОВЛЕНИЕ - Как упомянуто в одном из ответов ниже, у PM2 есть действительно хорошая функциональность, отсутствующая навсегда. Подумайте об этом.
Оригинальный ответ
Используйте nohup :
РЕДАКТИРОВАТЬ Я хотел бы добавить, что принятый ответ действительно путь. Я использую вечно в случаях, когда нужно не спать. Мне нравится делать
npm install -g forever
так, что это в пути узла, а затем просто сделатьforever start server.js
источник
nohup
означает,no hangup
что происходит со старых времен, когда вы хотели, чтобы вы поддерживали процесс, когда вы «зависаете» свой модем.Это может быть неприемлемым способом, но я делаю это с экраном, особенно в процессе разработки, потому что я могу восстановить его и, если необходимо, обмануть.
Экран отсоединится и выживет после выхода из системы. Затем вы можете вернуть его обратно с помощью screen -r. Нажмите на руководство по экрану для более подробной информации. Вы можете назвать экраны и еще много чего, если хотите.
источник
Обновление 2016 года: в серии node-windows / mac / linux используется общий API для всех операционных систем, поэтому это абсолютно актуальное решение. Однако; node-linux создает системные файлы инициализации. Поскольку популярность systemd продолжает расти, это действительно лучший вариант для Linux. PR приветствуется, если кто-то хочет добавить поддержку systemd в node-linux :-)
Оригинальная тема:
Сейчас это довольно старый поток, но ноды-окна предоставляют еще один способ создания фоновых сервисов в Windows. Это свободно основано на
nssm
концепции использованияexe
оболочки вокруг скрипта вашего узла. Однако; он используетwinsw.exe
вместо этого и предоставляет настраиваемую оболочку узла для более детального контроля над тем, как процесс запускается / останавливается при сбоях. Эти процессы доступны как любой другой сервис:Модуль также запекает в некоторых журналах событий:
Демонизация вашего скрипта осуществляется с помощью кода. Например:
Модуль поддерживает такие вещи, как закрытие перезапусков (чтобы плохие скрипты не мешали вашему серверу) и увеличение временных интервалов между перезапусками
Поскольку службы узлов Windows работают, как и любые другие, можно управлять / контролировать службу с помощью любого программного обеспечения, которое вы уже используете.
Наконец, нет никаких
make
зависимостей. Другими словами, простоnpm install -g node-windows
будет работать. Вам не нужна Visual Studio, .NET или магия нод-гипса, чтобы установить это. Кроме того, это MIT и BSD лицензированы.В полном раскрытии я являюсь автором этого модуля. Он был разработан для облегчения боли, которую испытал ОП, но с более тесной интеграцией в функциональность, которую уже обеспечивает операционная система. Я надеюсь, что будущие зрители с таким же вопросом найдут его полезным.
источник
ОБНОВЛЕНИЕ : я обновил, чтобы включить последние от pm2:
во многих случаях использование службы systemd является самым простым и наиболее подходящим способом управления процессом узла. для тех, кто выполняет многочисленные процессы узлов или независимо запускает микросервисы узлов в одной среде, pm2 - более полнофункциональный инструмент.
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
или списка процессов сpm2 list
pm2 logs
источник
Если вы просто хотите запустить скрипт без перерыва до его завершения, вы можете использовать его,
nohup
как уже упоминалось в ответах здесь. Однако ни один из ответов не предоставляет полную команду, которая также регистрируетstdin
иstdout
.>>
означает добавление кapp.log
.2>&1
гарантирует, что ошибки также отправляютсяstdout
и добавляются вapp.log
.&
гарантирует, что ваш текущий терминал отключен от команды, чтобы вы могли продолжить работу.Если вы хотите запустить сервер узла (или что-то, что должно запуститься при перезагрузке сервера), вы должны использовать systemd / systemctl .
источник
Если вы используете OSX, то самый простой способ создать настоящий системный процесс - использовать его
launchd
для запуска.Создайте plist, подобный этому, и поместите его в / Library / LaunchDaemons с именем
top-level-domain.your-domain.application.plist
(для его размещения вам нужно быть пользователем root):Когда закончите, выпустите это (как root):
и ты бежишь.
И вы все равно будете работать после перезагрузки.
Для других вариантов в листе списка просмотрите man-страницу здесь: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
источник
Попробуйте запустить эту команду, если вы используете nohup -
Вы также можете использовать навсегда, чтобы запустить сервер
PM2 также поддерживает
npm start
источник
pm2 start npm -- start
Я просто использую модуль демона npm:
В последнее время я также использую mon (1) от TJ Holowaychuk для запуска и управления простыми приложениями для узлов.
источник
Я использую Supervisor для разработки. Это просто работает. Когда вы вносите изменения в файл .js, Supervisor автоматически перезапускает ваше приложение с этими загруженными изменениями.
Вот ссылка на его страницу Github
Установить:
Вы можете легко заставить его смотреть другие расширения с -e. Другая команда, которую я часто использую, это -i, чтобы игнорировать определенные папки.
Вы можете использовать nohup и supervisor, чтобы приложение вашего узла работало в фоновом режиме даже после выхода из системы.
источник
Node.js в качестве фонового сервиса в WINDOWS XP
Установка:
Создайте c: \ node \ helloworld.js
Откройте командную консоль и введите следующее (setx, только если установлен Resource Kit)
Отличный пакетный вкус - создать c: \ node \ ServiceMe.cmd
Управление сервисом:
источник
Принятый ответ, вероятно, является лучшим производственным ответом, но для быстрого взлома, выполняя работу разработчика, я нашел это:
nodejs scriptname.js &
не сработало, потому что nodejs, казалось, сожрал &, и поэтому это не позволило мне продолжать использовать терминал без сценария script.js.Но я положил
nodejs scriptname.js
в файл .sh, иnohup sh startscriptname.sh &
работал.Определенно не производственная вещь, но она решает проблему «мне нужно продолжать использовать мой терминал и не хочу запускать 5 разных терминалов».
источник
Если вы используете nodejs на сервере Linux, я думаю, что это лучший способ.
Создайте сценарий службы и скопируйте в /etc/init/nodejs.conf
запуск службы: запуск узла sudo servicejs
остановка службы: остановка службы sudo
Сервисный скрипт
источник
Обновление
за июнь 2017: Решение для Linux: (Red Hat). Предыдущие комментарии не работают для меня. Это работает для меня на Amazon Web Service - Red Hat 7. Надеюсь, что это работает для кого-то там.
источник
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
чем он занимается. Можете ли вы дать мне более подробную информацию, пожалуйста. Я не уверен , но я думаю , что он перенаправляет трафик80
на8080
котором узел сервера прослушивает, не так ли?используйте nssm лучшее решение для windows, просто скачайте nssm , откройте cmd в каталоге nssm и введите
при этом будет установлена новая служба Windows, которая будет указана на сайте services.msc, откуда вы можете запускать или останавливать службу, эта служба будет запускаться автоматически, и вы можете настроить ее перезагрузку в случае сбоя.
источник
Чтобы завершить различные предлагаемые варианты, вот еще одна:
daemon
команда в GNU / Linux, о которой вы можете прочитать здесь: http://libslack.org/daemon/manpages/daemon.1.html . (извинения, если это уже упоминалось в одном из комментариев выше).источник
Проверьте фугу! Помимо запуска большого количества рабочих, вы также можете демонизировать процесс вашего узла!
http://github.com/pgte/fugue
источник
Кто-нибудь заметил тривиальную ошибку позиции «2> & 1»?
должно быть
источник
Я использую tmux для среды разработки нескольких окон / панелей на удаленных хостах. Отсоединить и поддерживать процесс в фоновом режиме очень просто. Посмотрите на Tmux
источник
Для людей, использующих более новые версии модуля daemon npm - вам нужно передавать файловые дескрипторы вместо строк:
источник
PM2 - это менеджер производственных процессов для приложений Node.js со встроенным балансировщиком нагрузки. Это позволяет вам поддерживать приложения в актуальном состоянии, перезагружать их без простоев и облегчать общие задачи системного администратора. https://github.com/Unitech/pm2
источник
Я удивлен, что никто не упомянул Гувнора
Я пробовал навсегда, pm2 и т. Д. Но, когда речь заходит о надежном контроле и показателях производительности в сети, я обнаружил, что Guvnor безусловно лучший. Плюс, это также полностью с открытым исходным кодом.
Изменить: Тем не менее, я не уверен, работает ли он на окнах. Я использовал это только на Linux.
источник
Поскольку в списке предоставленных ответов мне не хватает этой опции, я бы хотел добавить в 2020 году подходящую опцию: докер или любую эквивалентную контейнерную платформу. В дополнение к тому, что ваше приложение работает в стабильной среде, есть дополнительные преимущества безопасности, а также улучшенная переносимость.
Есть поддержка докеров для Windows, macOS и большинства / основных дистрибутивов Linux. Установка Docker на поддерживаемой платформе довольно проста и хорошо документирована. Настроить приложение Node.js так же просто, как поместить его в контейнер и запустить этот контейнер, убедившись, что он перезапускается после завершения работы.
Создать изображение контейнера
Предполагая, что ваше приложение доступно в / home / me / my-app на этом сервере, создайте текстовый файл Dockerfile в папке / home / me / my-app с содержимым, подобным этому:
Создайте изображение, используя команду как это:
Примечание. Последний параметр - это выбор папки, содержащей этот Dockerfile, а не сам Dockerfile. Вы можете выбрать другой, используя опцию -f .
Начать контейнер
Используйте эту команду для запуска контейнера:
Эта команда предполагает, что ваше приложение прослушивает порт 3000, и вы хотите, чтобы оно было выставлено на порту 80 вашего хоста.
Это очень ограниченный пример, но это хорошая отправная точка.
источник
Если вы используете pm2, вы можете использовать его с
autorestart
установленным наfalse
:Это сгенерирует образец
ecosystem.config.js
:источник
Ответ на этот вопрос довольно поздно к партии, но я обнаружил , что лучшим решением было написать скрипт , который использовал оба
screen -dmS
иnohup
команды.Я также добавляю
>> logfile
бит в конце, чтобы я мог легко сохранитьconsole.log()
операторы узла .Почему я использовал сценарий оболочки? Я также добавил оператор if, который проверял,
node myserver.js
запущен ли уже процесс.Таким образом, я смог создать единый параметр командной строки, который позволит мне поддерживать работу сервера, а также перезапустить его после внесения изменений, что очень полезно для разработки.
источник