如何停止应用程序,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 startnpm 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