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


81

Я встановив і запускаю сервер node.js на osx. Я розробив модуль чату і з задоволенням запускаю його. Я змінив деякі частини, і мені потрібно перезапустити сервер, щоб побачити ефекти.

Я знаю лише, як перезапустити, закривши вікно терміналу, а потім знову відкривши його, а потім знову запустивши вузол chatdemo.js.

Будь-який спосіб перезапустити, не закриваючи термінал?

Дякую.


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.


9
Ви також можете використовувати "вузол killall -2", який має такий самий ефект.
користувач123444555621

2
Не хочу / потрібно вбивати всі процеси вузлів. Якщо у мене відкрито якийсь вузол repl, я буду нещасним кемпером після цього рядка :)
rfunduk

8
примітка: запустіть демон вузла відnohup node server.js &
Drew LeSueur

52

Під час розробки найкращий спосіб перезапустити сервер для перегляду внесених змін - використовувати nodemon

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

nodemon [назва вашого додатка]

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

Перевірте nodemon git repo: https://github.com/remy/nodemon


Я не знав про цей модуль, це щось дуже корисне, нагадує мені мою програму django. Дякую.
Hola Soy Edu Feliz Navidad

Фантастична пропозиція. Дуже ефективно для розробки для швидкого тестування коду.
mbokil

добре, дякую, як ми можемо налаштувати eclipse на використання nodemon замість node ..?
Олександр Міллс

16

У цьому випадку ви часто перезапускаєте свій сервер node.js, оскільки він активно розробляється, і ви постійно вносите зміни. Існує чудовий сценарій гарячого перезавантаження, який впорається з цим, переглядаючи всі ваші файли .js та перезавантажуючи сервер node.js, якщо будь-який із цих файлів змінився. Просто квиток на швидкий розвиток та випробування.

Сценарій та пояснення, як ним користуватися, знаходяться тут, у Draco Blue .


5
FYI, зараз існує декілька вузлових модулів, присвячених саме цьому, загляньте на сторінку Вікі-модулі вузлів .
Марко

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

6

Сказати "nodemon" відповіло б на питання.

Але щодо того, як лише вбити (всіх) демонів (-ів) вузла, для мене працює наступне:

pkill -HUP node

5

Я розумію, що мій коментар стосується Windows, але може бути комусь корисним. Для виграшу в cmd:

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

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

node my_app.js

Крім того, ви можете використовувати його в командному файлі, із вхідними лапками:

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

Дуже зручно! Чудова ідея.
Радмація

2

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

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

process.stdin.on('data', function(data) {
  if (data == 'exit\n') process.exit();
});

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, для виробництва ми використовуватимемо значення, яке зберігається, але для розробки будемо використовувати nodemon для відстеження змін у вихідному файлі без перезапуску сервера. Там для нового значення для запуску використовується "start": "if [[$ NODE_ENV == 'production']]; тоді node ./bin/www; інакше 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 jusy, просто запустіть команду npm uninstall nodemon

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.