如何停止应用程序,node.js表示'npm开始'
您使用express v4.x构buildnode.js应用程序,然后通过npm start启动您的应用程序 。 我的问题是如何停止应用程序? 有没有npm停止 ?
执行npm停止时编辑包括错误
/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
是的,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的基础上自动处理的东西。
当我尝试build议的解决scheme,我意识到我的应用程序名称被截断。 我读了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 start
和npm stop
工作,当然npm stop
将总是终止所有正在运行的进程,但这对我来说没问题。
这里的所有其他解决scheme都依赖于操作系 任何操作系统的独立解决scheme使用socket.io如下。
package.json
有两个脚本:
"scripts": { "start": "node server.js", "stop": "node server.stop.js" }
server.js – 你平常的快递员住在这里
const express = require('express'); const app = express(); let 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 PC) let io = require('socket.io')(server); io.on('connection', (socketServer) => { socketServer.on('npmStop', () => { process.exit(0); }); });
server.stop.js
var io = require('socket.io-client'); var 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); });
testing一下
npm start
(像往常一样启动你的服务器)
npm stop
(这将停止您的运行服务器)
上面的代码还没有经过testing(这是我的代码削减版本,我的代码确实工作),但希望它的工作原样。 无论哪种方式,它提供了如果要使用socket.io来停止服务器的一般方向。
这是另一个解决scheme,混合了以前的答案的想法。 在解决平台独立性的问题时,采取“杀死进程”的方法。
它依靠树杀包来处理杀死服务器进程树。 我发现杀死了我的项目中所需的整个进程树,因为一些工具(例如babel-node
)产生了subprocess。 如果您只需要杀死一个进程,则可以使用内置的process.kill()
方法replacetree-kill。
解决scheme如下( spawn()
的前两个参数应该被修改,以反映运行你的服务器的特定配方):
build立/启动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立/停止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)
的package.json
"scripts": { "start": "babel-node build/start-server.js", "stop": "babel-node build/stop-server.js" }
请注意,此解决scheme从服务器分离启动脚本(即npm start
将立即返回,不会阻塞,直到服务器停止)。 如果您更喜欢传统的阻塞行为,只需删除spawn()
的options.detached
参数并调用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