您使用express v4.x构建node.js应用程序,然后通过npm start启动您的应用程序.我的问题是如何停止应用程序?有没有停止?
编辑以在实现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
Evan Carroll.. 59
是的,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 push自动处理的东西.
是的,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 push自动处理的东西.
此处的所有其他解决方案均取决于操作系 任何操作系统的独立解决方案都使用socket.io,如下所示.
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来停止服务器,它提供了一般方向.
当我尝试建议的解决方案时,我意识到我的应用名称被截断了.我process.title
在nodejs文档(https://nodejs.org/docs/latest/api/process.html#process_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 start
,npm stop
工作npm stop
总是会终止所有正在运行的进程,但这对我来说没问题.
这是薄荷版本的问题,也可以使用cmd。要终止服务器进程,只需运行以下命令:
taskkill -F -IM node.exe
检查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
在MAC OS X(/ BSD)上:您可以尝试使用lsof(列出打开的文件)命令
$ sudo lsof -nPi -sTCP:LISTEN
所以
$ kill -9 3320