代码改变世界

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+"进程成功");
		}
	})
}