当我在命令行中使用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...");
});
谢谢!
答案 0 :(得分:10)
我在普通的Windows cmd上试过它,它应该在那里工作。看起来git bash存在问题。
答案 1 :(得分:4)
我在使用npm
时遇到了同样的问题。但最后,我知道这是git本身的一个问题。
15天前GitHub上有 dscho 发表评论。他说他们正在努力在下一个版本中解决这个问题。他还分享了确切的msys-2.0.dll
文件,可以解决那些不能等待的人的问题。
但请务必在更换文件之前进行备份。
我也像以前一样在跑完express
后试图杀死它;在taskkill /im node.exe
上使用cmd
,但没有找到任何流程。
在GitHub上查看此问题,并搜索文件msys-2.0.dll
的名称,以便更快地获得评论。
答案 2 :(得分:2)
我在Windows机器上使用git bash,并在上个月左右遇到了这个问题。
我仍然不知道导致它的原因,但我找到了阻止它的另一种方法。
这使我能够快速停止服务器。
答案 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中。以下步骤:
- 打开一个MSYS2终端。
编辑
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
授权签名密钥(可能需要不时重复执行此步骤,直到修复https://github.com/msys2/msys2/issues/62为止)
[git-for-windows-mingw32] Server = https://wingit.blob.core.windows.net/i686
然后同步新存储库
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
此更新
pacboy update
,因此将要求您关闭窗口(不是,仅退出pacman进程)。不要惊慌,只需关闭所有当前打开的MSYS2 shell和MSYS2程序。全部关闭后,再次启动新终端。然后再次同步 (更新软件包的非核心部分):
msys2-runtime
最后安装Git / cURL软件包:
pacboy update
最后,通过在MINGW64 shell中执行
pacboy sync git:x git-doc-html:x git-doc-man:x git-extra: curl:x
来检查一切是否正常,并且应该输出类似git --version
(或更高版本)的内容。
注意::我发现第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信号。它将关闭服务器。
答案 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
把它带到前台也没有奏效。通过删除 &
解决了问题。