• node代码打包为 exe文件---端口进程关闭demo


    最近用到 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("
    ");
    			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("
    ");
    			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+"进程成功");
    		}
    	})
    }
    

      

  • 相关阅读:
    在 Laravel 5.1 中使用 Pjax
    在 iOS 中实现方法链调用
    利用 WireShark 深入调试网络请求
    设计一个健壮的后台下载
    设计一个健壮的大型文件下载系统
    iOS开发基础知识:Core Animation(核心动画)
    开发 Swift 和 Objective-C 混编的 Framework
    protobuf3 iOS 接入 protobuf
    iOS之ProtocolBuffer搭建
    iOS10 推送必看(基础篇)
  • 原文地址:https://www.cnblogs.com/muamaker/p/9877699.html
Copyright © 2020-2023  润新知