如何重新启动node.js服务器

92

我已经在OSX上安装并运行了一个Node.js服务器。我下载了一个聊天模块,并且正在愉快地运行它。我修改了一些部分并需要重新启动服务器以查看效果。

我只知道通过关闭终端窗口,然后重新打开它并再次运行node chatdemo.js来重新启动节点服务。

有没有不关闭终端的方法来重新启动服务器?

谢谢。


1
使用 forever https://github.com/foreverjs/forever。然后你只需要输入 forever restart 即可。 - basickarl
9个回答

118

如果只是在运行(不是守护进程),那么只需使用 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

ps 命令输出中的数字替换掉 PID


12
你也可以使用“killall -2 node”命令,它具有相同的效果。 - user123444555621
3
不想/不需要杀死所有的节点进程。如果我有一些节点 REPL 打开,执行那行代码后我会感到很不爽 :) - rfunduk
10
附注:通过 nohup node server.js & 启动一个节点守护进程。 - Drew LeSueur

61

在开发过程中,重启服务器以查看所做更改的最佳方式是使用nodemon

npm install nodemon -g

nodemon [你的应用程序名称]

nodemon将监视启动nodemon的目录中的文件,如果它们发生变化,它将自动重新启动您的Node应用程序。

查看nodemon git存储库:https://github.com/remy/nodemon


我之前不知道这个模块,它非常有用,让我想起了我的Django应用程序。谢谢。 - Hola Soy Edu Feliz Navidad
很棒的建议。对于开发人员快速测试代码非常高效。 - mbokil
好的,我们如何配置Eclipse使用nodemon而不是node呢? - Alexander Mills

18

我曾经遇到同样的问题,然后写了这个 shell 脚本来终止所有已存在的 node 进程:

#!/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"

将此内容保存为shell脚本(xxx.sh)文件后,您可能希望像这里描述的那样将其添加到PATH中。

请注意,这将终止所有进程名称中包含“node”的进程,除了grep自己的进程,因此在某些情况下它可能会导致终止一些其他具有类似名称的进程。


2
我使用的是Mac OSX,所以我不得不使用 cut -c17-20 - ThomasReggi
2
这不就是 pkill node 的用途吗? - tandrewnichols

16

在这种情况下,您经常重启node.js服务器,因为它处于活跃的开发状态,而且您一直在进行更改。有一个很棒的热加载脚本,可以通过监视所有.js文件并在这些文件中有任何更改时重新启动您的node.js服务器。非常适合快速开发和测试。

如何使用此脚本以及说明在此Draco Blue.


5
FYI现在有几个专门做这个的节点模块,可以查看“Node模块Wiki页面”(https://github.com/joyent/node/wiki/modules#wiki-build-and-deployment)。 - Marco

9

如果你想要回答这个问题,可以说“nodemon”。

但是如果你只想杀死所有的Node守护进程,以下方法适用于我:

pkill -HUP node

7

我明白我的评论与Windows有关,但可能对某些人有用。 对于Windows操作系统, 可以在命令提示符中运行以下命令:

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

非常方便!好主意。 - Radmation

4

如果我只是从控制台运行节点应用程序(而不使用forever等),我会使用control + C,不确定OSX是否有相同的组合键来终止,但比查找进程ID并杀死它要快得多,您还可以将以下代码添加到您正在使用的聊天应用程序中,然后在控制台中输入“exit”以关闭应用程序。

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

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

3

对于我来说,使用"kill -9 [PID]"或"killall -9 node"起作用了,而"kill -2 [PID]"却没有起作用。


2
不,不要使用 kill -9。它不允许进程干净地结束,会留下孤立的描述符,并且通常不需要。普通的 kill 就足够了,如果不行,kill -INT 就可以了。除非真的需要,否则不要使用 kill -9,而大多数情况下不需要。 - ThoriumBR

1
首先打开终端/命令行,然后进入您的项目目录,现在使用命令npm install nodemon --save-dev安装nodemon,此命令将确保它保存为开发人员依赖项。如果您正在使用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"
  }
}

现在修改你的package.json文件中的"start"属性值。对于生产环境,我们将使用现有的值,但是对于开发环境,我们将使用nodemon来跟踪源文件的更改而不需要重启服务器。因此,新的"start"属性值如下:"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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接