Як перезапустити сервер 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.