Как перезапустить сервер node.js

81

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

Я знаю только, как перезапустить, закрыв окно терминала, а затем снова его подключив, а затем снова запустив node chatdemo.js.

Любой способ перезапустить без закрытия терминала?

Благодарю.

jsnoob
источник
1
Используйте навсегда github.com/foreverjs/forever . Тогда все, что вам нужно напечатать, этоforever restart
basickarl

Ответы:

102

Если он просто запущен (а не демон), просто используйте Ctrl-C.

Если он демонизирован, вы можете попробовать:

$ ps aux | grep node
you   PID  1.5  0.2  44172  8260 pts/2    S    15:25   0:00 node app.js
$ kill -2 PID

Где PIDзаменяется числом на выходе ps.

rfunduk
источник
9
Вы также можете использовать «killall -2 node», который имеет тот же эффект.
user123444555621
2
Не хочу / не нужно убивать все процессы узла. Если у меня будет открыт какой-нибудь узел repl, я буду недоволен после этой строки :)
rfunduk
8
примечание: запустите демон узла, авторnohup node server.js &
Drew LeSueur
52

Во время разработки лучший способ перезапустить сервер, чтобы увидеть сделанные изменения, - это использовать nodemon.

npm установить nodemon -g

nodemon [название вашего приложения]

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

Проверьте репозиторий nodemon git: https://github.com/remy/nodemon

Нихил Вишну
источник
Я не знал об этом модуле, это что-то очень полезное, напоминает мне мое приложение django. Благодарю.
Hola Soy Edu Feliz Navidad
Фантастическое предложение. Очень эффективен для разработки для быстрого тестирования кода.
mbokil
хорошо, спасибо, как мы можем настроить eclipse для использования nodemon вместо node ..?
Александр Миллс
16

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

Сценарий и объяснение того, как его использовать, можно найти здесь, в Draco Blue .

Пол Робинсон
источник
5
К вашему сведению, теперь есть несколько модулей узлов, посвященных именно этому, взгляните на страницу Wiki модулей узлов .
Марко,
14

У меня была та же проблема, и я написал этот сценарий оболочки, который убивает все существующие процессы узла:

#!/bin/bash
echo "The following node processes were found:"
ps aux | grep " node " | grep -v grep
nodepids=$(ps aux | grep " node " | grep -v grep | cut -c10-15)

echo "OK, so we will stop these process/es now..."

for nodepid in ${nodepids[@]}
do
echo "Stopping PID :"$nodepid
kill -9 $nodepid
done
echo "Done"

После сохранения в виде файла сценария оболочки (xxx.sh) вы можете добавить его в свой PATH, как описано здесь .

(Обратите внимание, что это убьет все процессы с "node" в его имени, кроме собственного grep, поэтому я предполагаю, что в некоторых случаях он также может убить некоторые другие процессы с аналогичным именем)

Крокодил
источник
2
У меня mac osx, который мне приходилось использоватьcut -c17-20
ThomasReggi
1
Разве это не то pkill node, для чего?
tandrewnichols 04
6

Сказать «nodemon» - значит ответить на вопрос.

Но о том, как убить (всех) демона (ов) узла, у меня работает следующее:

pkill -HUP node
spaxxUnited
источник
5

Я понимаю, что мой комментарий касается окон, но может быть кому-то полезен. Для выигрыша запустите cmd:

wmic process  where "commandline like '%my_app.js%' AND name='node.exe' " CALL Terminate

тогда вы можете снова запустить приложение:

node my_app.js

Также вы можете использовать его в пакетном файле с escape-кавычками:

wmic process  where "commandline like '%%my_app.js%%' AND name='node.exe' " CALL Terminate
node my_app.js
dimaqw
источник
Очень удобно! Отличная идея.
Радмация
2

Если я просто запускаю приложение узла с консоли (не использую навсегда и т. Д.), Я использую control + C, не уверен, что OSX имеет ту же комбинацию клавиш для завершения, но намного быстрее, чем найти идентификатор процесса и убить его, вы также можете добавить следующий код для приложения чата, которое вы используете, а затем введите «exit» в консоли, когда захотите закрыть приложение.

process.stdin.resume();
process.stdin.setEncoding('utf8');

process.stdin.on('data', function(data) {
  if (data == 'exit\n') process.exit();
});
user511941
источник
1

Использование «kill -9 [PID]» или «killall -9 node» сработало для меня, когда «kill -2 [PID]» не сработало.

Стивен Х
источник
1
Нет, не уходи kill -9. Это не позволяет полностью завершить процесс, оставит дескрипторы «осиротевшими» и, как правило, ненужными. Ванильkill , а если нет, kill -INTто хватит. Не ходите, kill -9если это действительно не нужно, а в большинстве случаев это не так.
ThoriumBR
1

Сначала откройте терминал / командную строку, затем перейдите в каталог вашего проекта, теперь установите nodemon с помощью команды npm install nodemon --save-dev, эта команда гарантирует, что он сохранен как зависимость разработчика. Если вы работаете с expressjs, то в вашем файле пакета это будет выглядеть так:

{
  "name": "expressjs-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "^2.0.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.3"
  }
}

теперь измените значение «start» в файле package.json, для производства мы будем использовать значение exsiting, но для разработки будем использовать nodemon для отслеживания изменений в исходном файле без перезапуска сервера. Там для нового значения для начала будет "start": "if [[$ NODE_ENV == 'production']]; then node ./bin/www; else nodemon ./bin/www; fi"

окончательный файл package.json будет выглядеть так

{
  "name": "expressjs-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "if [[$NODE_ENV=='production']]; then node ./bin/www; else nodemon ./bin/www; fi"
  },
  "dependencies": {
    "cookie-parser": "~1.4.4",
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "pug": "^2.0.4"
  },
  "devDependencies": {
    "nodemon": "^2.0.3"
  }
}

чтобы удалить nodemon, просто запустите команду npm uninstall nodemon

Лорд
источник