节点JS ctrl + C不会停止服务器(用“npm start”启动服务器后)

时间:2017-06-27 20:07:00

标签: javascript node.js npm

当我在命令行中使用node app.js启动我的服务器时(使用Git Bash),我可以使用ctrl + C来停止它。

在我的package.json文件中,我得到了这个启动脚本,允许我使用命令npm start来启动服务器:

"scripts": {
    "start": "node app"
},

当我这样做时,服务器正常启动:

$ npm start

> nodekb@1.0.0 start C:\Projects\nodekb
> node app.js

Server started on port 3000...

但是当我现在ctrl + C时,服务器不会停止(节点进程仍然保留在任务管理器中)。这意味着当我再次尝试npm start时出现错误,因为端口3000仍在使用中。

我正在关注youtube上的教程(video with timestamp),当这个人按ctrl + C然后再次运行npm start时,它会正常工作。

当我使用ctrl + C时,我的服务器进程没有停止的任何想法?

我的app.js文件,如果需要:

var express = require("express");
var path = require("path");

//Init app
var app = express();

//Load View Engine
app.set("views", path.join(__dirname, "views"));
app.set("view engine", "pug");

//Home Route
app.get("/", function(req, res) {
  res.render("index", {
    title: "Hello"
  });
});

//Add route
app.get("/articles/add", function (req, res) {
  res.render("add_article", {
    title: "Add Article"
  });
});

//Start server
app.listen(3000, function() {
  console.log("Server started on port 3000...");
});

谢谢!

12 个答案:

答案 0 :(得分:10)

我在普通的Windows cmd上试过它,它应该在那里工作。看起来git bash存在问题。

答案 1 :(得分:4)

我在使用npm时遇到了同样的问题。但最后,我知道这是git本身的一个问题。

15天前GitHub上有 dscho 发表评论。他说他们正在努力在下一个版本中解决这个问题。他还分享了确切的msys-2.0.dll文件,可以解决那些不能等待的人的问题。

个人,我等不及了:p。所以,我试了一下,下载了文件,并按照他的说法把它扔进了git文件夹。问题一去不复返了!太棒了!

但请务必在更换文件之前进行备份。

我也像以前一样在跑完express后试图杀死它;在taskkill /im node.exe上使用cmd,但没有找到任何流程。

GitHub上查看此问题,并搜索文件msys-2.0.dll的名称,以便更快地获得评论。

答案 2 :(得分:2)

我在Windows机器上使用git bash,并在上个月左右遇到了这个问题。

我仍然不知道导致它的原因,但我找到了阻止它的另一种方法。

  1. 打开任务管理器
  2. 进入流程标签
  3. 查找 node.exe ,然后按结束流程
  4. 这使我能够快速停止服务器。

答案 3 :(得分:1)

即使在最新版本(x64 2018-05-31)中,我在MSYS2 proper中也遇到了这个问题。

幸运的是,Git for Windows维护定制的MSYS2运行时。它们具有尚未发送到上游的补丁,包括patch that fixes emulation of SIGINT, SIGTERM and SIGKILL

讨论:https://github.com/nodejs/node/issues/16103

通过遵循these instructions,我可以使我的“ MSYS2正常”平台在Windows的MSYS2运行时中使用Git。

为后代而重复:

  

在MSYS2内部正确安装

     

本指南假定您需要Windows的64位版本的Git。

     

用于Windows的Git基于MSYS2,可以将git软件包安装到现有的MSYS2安装中。这意味着,如果您已经在计算机上使用MSYS2,则可以在不运行完整安装程序或使用便携式版本的情况下,将Git for Windows用于Windows。

     

但是请注意,使用这种方法有一些注意事项。 Windows的Git为msys2-runtime创建了一些尚未向上游发送的补丁。 (这已经计划好了,但是在问题#284中确定可能不会发生。)这意味着必须安装自定义msys2-runtime的Windows版Git,以使{{1 }}在MSYS2中。

     

以下步骤:

     
      
  1. 打开一个MSYS2终端。
  2.   
  3. 编辑git并在/etc/pacman.conf之前(在我的计算机上的第71行),添加[mingw32]软件包存储库:

    git-for-windows
         

    以及可选的相反体系结构的MINGW-only存储库(即用于64位SDK的MINGW32):

    [git-for-windows]
    Server = https://wingit.blob.core.windows.net/x86-64 
    
  4.   
  5. 授权签名密钥(可能需要不时重复执行此步骤,直到修复https://github.com/msys2/msys2/issues/62为止)

    [git-for-windows-mingw32]
    Server = https://wingit.blob.core.windows.net/i686
    
  6.   
  7. 然后同步新存储库

    curl -L https://raw.githubusercontent.com/git-for-windows/build-extra/master/git-for-windows-keyring/git-for-windows.gpg |
    pacman-key --add - &&
    pacman-key --lsign-key 1A9F3986
    
  8.   
  9. 此更新pacboy update ,因此将要求您关闭窗口(不是,仅退出pacman进程)。不要惊慌,只需关闭所有当前打开的MSYS2 shell和MSYS2程序。全部关闭后,再次启动新终端。

  10.   
  11. 然后再次同步 (更新软件包的非核心部分):

    msys2-runtime
  12.   
  13. 最后安装Git / cURL软件包:

    pacboy update
    
  14.   
  15. 最后,通过在MINGW64 shell中执行pacboy sync git:x git-doc-html:x git-doc-man:x git-extra: curl:x 来检查一切是否正常,并且应该输出类似git --version(或更高版本)的内容。

  16.   

注意::我发现第7步安装的git version 2.14.1.windows.1软件包非常具有侵入性(它添加了一条消息“欢迎使用Windows SDK的Git!” 到您打开的每个终端),因此我用git-extra将其删除了。

注2::我还发现Windows的Git MSYS2运行时与MSYS2正确的在不同的主目录中打开。这也意味着它读取了错误的bash配置文件。我通过在控制面板中向Windows添加环境变量来解决此问题:pacman -R git-extra

答案 4 :(得分:1)

Ctrl + C不会终止服务器。解决该问题的方法是在server.js中使用以下代码段:

process.on('SIGINT', function() {
  console.log( "\nGracefully shutting down from SIGINT (Ctrl-C)" );
  // some other closing procedures go here
  process.exit(1);
});

这对我有用。

您还可以检查在Graceful shutdown in NodeJS

中提到的其他解决方案

答案 5 :(得分:0)

这可能只是您的控制台无法准确地将命令发送到进程的问题。这很常见,尤其是在使用第三方控制台(如cmdr / conemu)时。

解决方案?

几次点击ctrl + c直到它关闭:P

答案 6 :(得分:0)

有时节点进程会挂起。  使用ps检查进程ID您可能希望grep for node然后使用kill -9 [PID]

终止进程

答案 7 :(得分:0)

我能够通过使用TCP View检查端口来调试此问题,并意识到我的节点服务器正在运行,即使我已按下ctrl-C来停止它。我建议完全杀死你正在运行节点的终端。

答案 8 :(得分:0)

使用Ctrl + C,然后输入:> pm2 stop all all

这将停止所有服务器或当你使用nodejs进行堆栈时。

答案 9 :(得分:0)

使用Ctrl + \发送SIGQUIT信号。它将关闭服务器。

参考-https://en.wikipedia.org/wiki/Signal_(IPC)

答案 10 :(得分:0)

我能够通过切换到nodemon来运行服务器来解决此问题。

npm install --save-dev nodemon

package.json

"scripts": {
    "start": "nodemon app"
},

我试图让json-server退出自定义服务器脚本,但是它始终使子进程在Windows上运行。在Windows上通过express运行npm似乎是一个特定的问题。如果直接通过c:>node server.js运行服务器,则它似乎已正确退出。

答案 11 :(得分:0)

在脚本下的 package.json 中,我有这行 react-scripts start&。请注意,它以 & 结尾,这会将进程发送到后台,而 ctrl+c 将不起作用。不知何故,试图用 fg 把它带到前台也没有奏效。通过删除 & 解决了问题。