node代码打包为 exe文件---端口进程关闭demo
2018-10-30 16:38 muamaker 阅读(1351) 评论(0) 编辑 收藏 举报最近用到 java,用tomcat起的服务,经常服务关了,对应的进程还在跑,导致再次启动服务失败,需要手动关闭进程。
使用 dos命令虽然只有两行,总是输,也很烦。
netstat -ano | findstr 8080 //查找8080端口,对应的进程 taskkill /pid 5684 /f //关闭进程 5684
于是就想着,写一个 .bat 的文件,每次直接点击一下就好,可惜 dos命令玩不熟,折腾一番,决定放弃,换自己熟悉的语言 node来,然后使用 pkg 将node文件打包为 .exe 文件;
node版本太低不行,反正我的 7.16失败,后面安装了 8.x才行
npm install -g pkg
npm i node-cmd
index.js
var cmd=require('node-cmd'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); process.stdout.write('请输入端口:'); //标准输出 process.stdin.on('data', function (data) { var str = data.slice(0, -2); process.stdin.emit('end'); var num = parseInt(str); if(num){ getProcessId(num); }else{ process.stdout.write('输入的端口无效:'+str); } }); process.stdin.on('end', function () { }); function getProcessId(port){ cmd.get( 'netstat -ano | findstr '+ port, //查找端口对应的进程 function(err, data, stderr){ //console.log(err, data, stderr); if(err){ process.stdout.write(port +"端口没有被占用"); }else{ var arr = data.split("\r\n"); var cache = {}; for(var i = 0; i < arr.length; i++){ var item = arr[i]; if(item){ var pid = getPid(item);//提取出的进程id pid = parseInt(pid); console.log(item); //console.log(port); if(pid && !cache[pid]){ cache[pid] = true; //防止重复的杀进程 console.log("开始关闭进程:"+pid) killProcess(pid); } } } } cmd.get( 'PAUSE', //等待.. function(err, data, stderr){ }); }); //taskkill /pid 13064 /f cmd.run('touch example.created.file'); } function getPid(item){ var p = ''; for(var i = item.length -1; i > 0 ; i--){ if(item[i] == ' '){ return item.substring(i); } } return 0; } function killProcess(pid){ cmd.get( 'taskkill /pid '+ pid +' /f', //杀掉对应的进程 function(err, data, stderr){ if(err){ console.log(err); }else{ console.log("关闭"+pid+"进程成功"); } }); }
打包命令:注意node版本不能太低
pkg -t win index.js
打包完成之后,直接双击运行,输入端口,就会关掉对应的进程
关闭 进程,还可以用node子进程来实现
const c = require('child_process'); process.stdin.resume(); process.stdin.setEncoding('utf-8'); process.stdout.write('请输入端口:'); //标准输出 process.stdin.on('data', function (data) { var str = data.slice(0, -2); process.stdin.emit('end'); var num = parseInt(str); if(num){ getProcessId(num); }else{ process.stdout.write('输入的端口无效:'+str); } }); process.stdin.on('end', function () { }); function getProcessId(port){ c.exec(`netstat -ano|findstr ${port}`, function(error, stdout, stderr){ if(error){ console.log("该端口没有被占用"); }else{ var arr = stdout.split("\r\n"); var cache = {}; for(var i = 0; i < arr.length; i++){ var item = arr[i]; if(item){ var pid = getPid(item);//提取出的进程id pid = parseInt(pid); if(pid && !cache[pid]){ cache[pid] = true; //防止重复的杀进程 console.log("开始关闭进程"+pid) killProcess(pid); } } } } c.exec("pause",function(){ }); }); } function getPid(item){ var p = ''; for(var i = item.length -1; i > 0 ; i--){ if(item[i] == ' '){ return item.substring(i); } } return 0; } function killProcess(pid){ c.exec(`taskkill /pid ${pid} /f`,function(error, stdout, stderr){ if(error){ console.log(error); }else{ console.log("关闭"+pid+"进程成功"); } }) }