如何阻止 node.js 表示“ npm start”的应用程序

使用 Express v4.x 构建 node.js 应用程序,然后通过 NPM 开始启动应用程序。我的问题是怎么阻止这个应用?有 NPM 站吗?

EDIT 在实现时包含错误 < strong > npm stop

/home/nodetest2# npm stop


> nodetest2@0.0.1 stop /home/nodetest2
> pkill -s SIGINT nodetest2


pkill: invalid argument for option 's' -- SIGINT


npm ERR! nodetest2@0.0.1 stop: `pkill -s SIGINT nodetest2`
npm ERR! Exit status 2
411846 次浏览

是的,npm 也提供了一个停止脚本:

npm help npm-scripts

Prestop,stop,poststop: 通过 npm stop 命令运行。

在 package.json 中设置上面的一个,然后使用 npm stop

npm help npm-stop

如果设置为 app.js,就可以使这个过程变得非常简单,

Process.title = myApp;

然后在 scripts.json 中,

"scripts": {
"start": "app.js"
, "stop": "pkill --signal SIGINT myApp"
}

也就是说,如果这是我,我会使用 pm2或其他自动处理这个基础上的 git 推。

当我尝试建议的解决方案,我意识到我的应用程序名称被截断。我阅读了 nodejs 文档(https://nodejs.org/docs/latest/api/process.html#process_process_title)中关于 process.title的内容

在 Linux 和 OS X 上,它仅限于二进制名称的大小加上命令行参数的长度,因为它覆盖 argv 内存。

我的应用程序不使用任何参数,所以我可以添加这行代码到我的 app.js

process.title = process.argv[2];

然后将这几行添加到我的 package.json文件中

  "scripts": {
"start": "node app.js this-name-can-be-as-long-as-it-needs-to-be",
"stop": "killall -SIGINT this-name-can-be-as-long-as-it-needs-to-be"
},

使用非常长的进程名称。npm startnpm stop工作,当然 npm stop将始终终终止所有运行的进程,但这对我来说是确定的。

这里的所有其他解决方案都依赖于操作系统。

package.json有两个脚本:

"scripts": {
"start": "node server.js",
"stop": "node server.stop.js"
}

Server.js-你通常的快递东西放在这里

const express = require('express');
const app = express();
const server = http.createServer(app);
server.listen(80, () => {
console.log('HTTP server listening on port 80');
});


// Now for the socket.io stuff - NOTE THIS IS A RESTFUL HTTP SERVER
// We are only using socket.io here to respond to the npmStop signal
// To support IPC (Inter Process Communication) AKA RPC (Remote P.C.)


const io = require('socket.io')(server);
io.on('connection', (socketServer) => {
socketServer.on('npmStop', () => {
process.exit(0);
});
});

Server.stop.js

const io = require('socket.io-client');
const socketClient = io.connect('http://localhost'); // Specify port if your express server is not using default port 80


socketClient.on('connect', () => {
socketClient.emit('npmStop');
setTimeout(() => {
process.exit(0);
}, 1000);
});

测试一下

npm start(像往常一样启动服务器)

npm stop(这将停止您正在运行的服务器)

上面的代码还没有经过测试(它是我的代码的一个精简版本,我的代码确实可以工作) ,但是希望它可以按原样工作。无论哪种方式,如果您想使用 socket.io 停止服务器,它都提供了一般方向。

下面是另一个混合了以前答案的解决方案。它采用了“终止过程”的方法,同时解决了平台独立性的问题。

它依赖于 砍树包来处理杀死服务器进程树。我发现在我的项目中必须删除整个过程树,因为有些工具(例如 babel-node)会产生子进程。如果只需要终止一个进程,则可以使用内置的 process.kill()方法替换 tree-kill。

解决方案如下(应该修改 spawn()的前两个参数以反映运行服务器的特定配方) :

Build/start-server. js

import { spawn } from 'child_process'
import fs from 'fs'


const child = spawn('node', [
'dist/server.js'
], {
detached: true,
stdio: 'ignore'
})
child.unref()


if (typeof child.pid !== 'undefined') {
fs.writeFileSync('.server.pid', child.pid, {
encoding: 'utf8'
})
}

Build/stop-server. js

import fs from 'fs'
import kill from 'tree-kill'


const serverPid = fs.readFileSync('.server.pid', {
encoding: 'utf8'
})
fs.unlinkSync('.server.pid')


kill(serverPid)

包裹 Json

"scripts": {
"start": "babel-node build/start-server.js",
"stop": "babel-node build/stop-server.js"
}

注意,这个解决方案将启动脚本从服务器中分离出来(例如,npm start将立即返回,并且在服务器停止之前不会阻塞)。如果您喜欢传统的阻塞行为,只需将 options.detached参数移除到 spawn(),并调用到 child.unref()

Netstat-nptl检查所有进程

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      1736/mongod
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1594/sshd
tcp6       0      0 :::3977                 :::*                    LISTEN      6231/nodejs
tcp6       0      0 :::22                   :::*                    LISTEN      1594/sshd
tcp6       0      0 :::3200                 :::*                    LISTEN      5535/nodejs

它只是通过 PID 引用杀死进程... 。在我的示例中,我想停止6231/nodejs,因此我执行以下命令:

kill -9 6231

如果是非常简单的,只要终止过程. 。

localmacpro$ ps
PID TTY           TIME CMD
5014 ttys000    0:00.05 -bash
6906 ttys000    0:00.29 npm
6907 ttys000    0:06.39 node /Users/roger_macpro/my-project/node_modules/.bin/webpack-dev-server --inline --progress --config build/webpack.dev.conf.js
6706 ttys001    0:00.05 -bash
7157 ttys002    0:00.29 -bash


localmacpro$ kill -9 6907 6906

这是一个敏感的版本问题,可以选择使用 cmd:

    taskkill -F -IM node.exe

关于 MAC OS X (/BSD) : 您可以尝试使用 lsa (列出打开的文件)命令

$ sudo lsof -nPi -sTCP:LISTEN

enter image description here

所以

$ kill -9 3320

你必须按组合键 ctrl + z 我的 OS 是 Ubuntu

所有(3)解决方案是:

1-ctlr + C

2-in json 文件 写一个停止的脚本

“脚本”: { “停止”: “杀死所有信息”“这个名字能长到它需要的程度” },

* 使用命令 write//npm stop//

3-重新启动电脑

如果你已经尝试了 ctrl + c,它仍然不工作,你可能想尝试这一点。这招对我很管用。

  1. 以管理员身份运行命令行。然后运行下面的命令查找要杀死的 processID (PID)。在 <yourPortNumber>中键入端口号

    netstat -ano | findstr :<yourPortNumber>

enter image description here

  1. 然后在确定 PID 之后执行此命令。

    taskkill /PID <typeYourPIDhere> /F

enter image description here

来自 http://www.callstack.in/tech/blog/windows-kill-process-by-port-number-157的@mit $ingh

对于生产环境,您应该使用 Forever.js

它对于启动和停止节点进程非常有用,你也可以列出正在运行的应用程序。

Https://github.com/foreverjs/forever

可以使用 pm2

Https://pm2.keymetrics.io/docs/usage/quick-start/

安装后只需输入终端即可

pm2 start app.js 然后

pm2 stop 0停止服务器

对于 windows 机器(我在 windows 10上) ,如果 cli 上的 CTRL + C (取消/中止)命令不起作用,屏幕显示如下:

enter image description here

尝试先按 ENTER (或任何键) ,然后按 CTRL + C,当前进程会询问您是否要终止批处理作业:

enter image description here

也许 CTRL + C 只终止父进程,而 npm start 与其他子进程一起运行。虽然不太确定为什么要在 CTRL + C 之前按那个额外的键,但是它比关闭命令行然后重新启动要好。

您可能需要检查的一个相关问题是: https://github.com/mysticatea/npm-run-all/issues/74

如果您的 json 文件没有停止应用程序的脚本,我使用的一个选项是在 cmd 上按 ctrl + C。

kill $(lsof -t -i :PORT_TO_KILL)

简化版。简单的复制粘贴与端口杀死 ex.5000