开发一个页面操作远程服务器jar包启动停止以及查看运行日志

1. 创建一个普通的 springboot 项目

     创建过程不再赘述,可以自行百度

2. 加入pom.xml 依赖

  <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        
           <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.9</version>
        </dependency>

		<!--添加servlet的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--不同项目之前调用 httpclient -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.5.3</version>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpmime</artifactId>
            <version>4.5.3</version>
            <scope>compile</scope>
        </dependency>
        
        <!-- ssh  -->
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>262</version>
        </dependency>
    </dependencies>

  1. 写页面

    加入页面所需的 js css 等,采用elementui 编写页面,代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">

    <!-- 引入阿里图标-->
    <link rel="stylesheet"  type="text/css" href="./iconfonts/iconfont.css">
    <!-- 引入样式 -->
    <link rel="stylesheet" type="text/css" href="./element/element-Index.css">
    <!-- 引入组件库 -->
    <script src="./element/vue.js"></script>
    <script src="./element/index.js"></script>
    <script src="./js/qs.min.js"></script>
    <script src="./js/axios.min.js"></script>
    <script src="./js/httpclient.js"></script>
    <style>
        .leftMenu{
            background-color: #E4E7ED;
            width:600px;
            float:left;
            padding: 40px 20px;
        }
        .showTable{
            background-color: #E4E7ED;
            float:right;
            padding: 40px 20px;
        }
       
    </style>
</head>
<body style="margin: 0;padding: 0;">

<div id="app">
  
       <el-row style="margin: 50px 20px" :gutter="20">
          <el-col :span="10">
             <el-card>
                <div style="margin:0px 10px 20px 0px;font-size: 18px">服务器配置</div>
			     <el-form :model="sshForm" ref="sshForm" :rules="rules" label-width="100px">
				  <el-form-item prop="ip" label="IP">
				    <el-input v-model="sshForm.ip" size="mini" placeholder="请输入IP" style="width:80%;"></el-input>
				  </el-form-item>
				  <el-form-item prop="user" label="账号">
				    <el-input v-model="sshForm.user" size="mini" placeholder="请输入账号" style="width:80%;"></el-input>
				  </el-form-item>
				  <el-form-item prop="pwd" label="密码">
				    <el-input v-model="sshForm.pwd" size="mini" placeholder="请输入密码" style="width:80%;"></el-input>
				  </el-form-item>
				  <el-form-item prop="folder" label="文件夹路径">
				    <el-input v-model="sshForm.folder" size="mini" placeholder="请输入文件夹路径" style="width:80%;"></el-input>			  
				  </el-form-item>
				</el-form>
				  <div style="text-align:right;margin-right:15%;"> 
				     <el-button  type="primary"  @click="queryJar"  size="mini"  v-loading='loading'>确定</el-button>
				  </div>
                </el-card> 
             </el-col>
            <el-col  :span="14">
                   
		  <el-card  v-if="showL === 'default'" > 
		    
		     <el-table size="mini" :data="sshTable" >
		        <el-table-column  prop="fileName" label="jar包"></el-table-column>
		        <el-table-column  prop="isRunning" label="状态">
		        	<template slot-scope="scope">
		        		<div v-if="scope.row.isRunning == true" >  <div size="mini" style="width: 100px;background: #f0f9eb ;text-align: center">运行中</div></div>
		        		<div v-if="scope.row.isRunning == false" >   <div size="mini" style="width: 100px;background:oldlace ;text-align: center" >已结束</div></div>
		        	</template>
		        </el-table-column>
		        <el-table-column  label="操作" width="200">
		            <template slot-scope="scope">
		                <el-button v-if="scope.row.isRunning == false"   size="mini" type="success" @click="startJar(scope.row)" v-loading="scope.row.isClick" >启动</el-button>
		                <el-button v-if="scope.row.isRunning == true" size="mini" type="danger" @click="stopJar(scope.row)" v-loading="scope.row.isClick" >停止</el-button>
		                <el-button   size="mini"  @click="catLog(scope.row)"  >日志</el-button>
		            </template>
		        </el-table-column>
              </el-table>
          </el-card>  
          <el-card  v-if="showL === 'log'" style="overflow: auto; background:#000000; color:#FFFFFF;height:500px" >
           
            <div style="position: fixed;right: 100px;">
             <el-button    size="mini"  @click="catLog('refersh')"  >刷新</el-button>
             <el-button  type="success"   size="mini"  @click="returnBtn"  >返回</el-button>
             
             </div>
           <pre>{{showLog}}</pre>
		  </el-card> 
                        
         </el-col>
   </el-card>
	
</div>
</body>

<script>

    new Vue({
        el: '#app',
        data() {
            return {
            	sshHeight: ((document.documentElement.clientHeight || document.body.clientHeight) -80),
            	sshWidth: ((document.documentElement.clientWidth || document.body.clientWidth) -680),
            	loading: false,
            	sshTable: [
            	],
            	row:'',
            	showL:'default',
            	showLog:'',
                sshForm: {
                    ip: '',
                    user: '',
                    pwd: '',
                    folder: '',
                    fileName: '',
                    isRunning: false,
                    isClick: false
                },
                rules: {
                	ip: [
                        { required: true, message: '请输入IP', trigger: 'blur' }
                    ],
                    user: [
                        { required: true, message: '请输入账号', trigger: 'blur' }
                    ],
                    pwd: [
                        { required: true, message: '请输入密码', trigger: 'blur' }
                    ],
                    folder: [
                        { required: true, message: '请输入文件夹路径', trigger: 'blur' }
                    ],
                },
            }
        },
        mounted() {
        	if(localStorage.getItem('folder') != null){
        		this.sshForm.folder = localStorage.getItem('folder');
        	}
        	if(localStorage.getItem('user') != null){
        		this.sshForm.user = localStorage.getItem('user');
        	}
        	if(localStorage.getItem('ip') != null){
        		this.sshForm.ip = localStorage.getItem('ip');
        	}
        	if(localStorage.getItem('pwd') != null){
        		this.sshForm.pwd = localStorage.getItem('pwd');
        	}
        },
        methods: {
        	queryJar(){
        		let that = this;
        		this.showL= 'default';
        		that.$refs['sshForm'].validate((valid) => {
        			if (valid) {
        				that.loading = true;
        				post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
	    	                    if(response.data.isLogin){
	    	                    	that.loading = false;
	    	                    	console.log("=====",response.data.list);
	    	                        that.sshTable = response.data.list;
	    	                        if(localStorage.getItem('folder') != null){
	    	                        	localStorage.removeItem("folder");
	    	                        }
	    	                        if(localStorage.getItem('user') != null){
	    	                        	localStorage.removeItem("user");
	    	                        }
	    	                        if(localStorage.getItem('ip') != null){
	    	                        	localStorage.removeItem("ip");
	    	                        }
	    	                        if(localStorage.getItem('pwd') != null){
	    	                        	localStorage.removeItem("pwd");
	    	                        }
	    	                        localStorage.setItem('ip',that.sshForm.ip);
	    	                        localStorage.setItem('pwd',that.sshForm.pwd);
	    	                        localStorage.setItem('user',that.sshForm.user);
	    	                        localStorage.setItem('folder',that.sshForm.folder);
	    	                        that.$notify({
	    	                            message: '查询成功',
	    	                            type: 'success'
	    	                        });
	    	                    }else{
	    	                    	that.loading = false;
	    	                    	that.$notify({
	    	                            message: response.data.msg,
	    	                            type: 'error'
	    	                        });
	    	                    	 that.sshTable = [];
	    	                    }
    	                }).catch(function (error) {
    	                    console.log(error);
    	                });
        			}
        		});
        	},
        	catLog(row){
        		if(row == 'refersh'){
        			row = this.row;
        		}else{
        			this.row = row;
        		}
        		let that = this;
            		post("catLog",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'fileName':row.fileName}).then(function (response){
            			if(response.data.code == '200' ){		
            				that.showLog = response.data.list;				
            			    that.showL = 'log'
            			}
	          
                }).catch(function (error) {
                    console.log(error);
                });
        	},
        	returnBtn(){
        		this.showL = 'default'
        	},
        	
        	startJar(row){
        		let that = this;
        		row.isClick = true;
        		let code = false;
        		post("runJar",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'fileName':row.fileName}).then(function (response){
	                    console.log(that.sshForm);
	                    setTimeout(function () {
	                     post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
	                    	if(response.data.code == '200'){
	                    		that.sshTable = response.data.list;
	                    		for(let j=0;j<response.data.list.length;j++){
	                    			if(row.fileName == response.data.list[j].fileName){
	                    				if(row.isRunning != response.data.list[j].isRunning){
	                    					console.log(123);
	                    					code = true;
	                    					that.$notify({
		           	                             message: '启动成功',
		           	                             type: 'success'
		           	                        });
		                    				break;
	                    				}
	                    			}
	                    		} 
	                    		if(code == false){
	                    			that.$notify({
          	                             message: '启动失败',
          	                             type: 'error'
          	                        });
	                    		}
	                    		
	                    	}else{
	                    		that.$notify({
    	                            message: response.data.msg,
    	                            type: 'error'
    	                        });
	                    	}
	                    }).catch(function (error) {
    	                    console.log(error);
    	                });
	                    }, 30000);
                }).catch(function (error) {
                    console.log(error);
                });
        	},
        	stopJar(row){
        		let that = this;
        		row.isClick = true;
        		let code = false;
        		post("stopJar",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder,'pId':row.pId,'fileName':row.fileName}).then(function (response){
                    setTimeout(function () {
                     post("getFile",{'ip':that.sshForm.ip,'user':that.sshForm.user,'pwd':that.sshForm.pwd,'folder':that.sshForm.folder}).then(function (response){
                    	if(response.data.code == '200'){
                    		that.sshTable = response.data.list;
                    		for(let j=0;j<response.data.list.length;j++){
                    			if(row.fileName == response.data.list[j].fileName){
                    				if(row.isRunning != response.data.list[j].isRunning){
                    					code = true;
                                   	    row.isClick = false;
                                       	that.$notify({
                                               message: '停止成功',
                                               type: 'success'
                                        });	
	                    				break;
                    				}
                    			}
                    		} 
                    		if(code == false){
                    			that.$notify({
      	                             message: '启动失败',
      	                             type: 'error'
      	                        });
                    		}
                    	}else{
                    		that.$notify({
   	                            message: response.data.msg,
   	                            type: 'error'
   	                        });
                    	}
                    }).catch(function (error) {
   	                    console.log(error);
   	                });
        		}, 3000);
                }).catch(function (error) {
                    console.log(error);
                });
        		
        	}
        },
    });
</script>
</html>

页面成功效果

在这里插入图片描述

在这里插入图片描述

  1. 后端代码详解(service层)

    4.1 测试服务器链接是否成功,通过ssh工具

 /**
	  * 检查链接是否成功
	  * @param server
	  * @return
	  */
     public Connection isLogin(Server server) {
        Connection  conn = SshUtil.login(server.getIp(), server.getUser(), server.getPwd());     
		return conn;
	}

4.2 获取目录下指定文件jar包

	/**
	 * 返回文件夹下所有文件
	 * @param server
	 * @return
	 */
	public List<String> getFile(Server server) {
		List <String> listNew = new ArrayList<>();
	    String cmd = "cd " + server.getFolder() + "&&ls";
	    List <String> list = SshUtil.execute(this.isLogin(server), cmd);  
        for(int i=0; i<list.size(); i++) {
        	  if(list.get(i).contains(".jar")) {  	
      	    	String[] split = list.get(i).split(" ");
      	    	listNew.add(split[split.length - 1]);
      	    }  
        }
        
		return listNew;
	}

4.3 启动jar 包

List <String> list = new ArrayList<>();
	
		String cmd = "nohup java -jar  " + server.getFolder() + "/" + 
		server.getFileName() + ">" + server.getFolder() + "/" + server.getFileName().substring(0, server.getFileName().length() - 4) +".out" +"&";
        list = SshUtil.executeJava(this.isLogin(server), cmd);    
		return true;

4.4 停止jar 包

	/**
	 * kill jar
	 * @return
	 */
	public Boolean stopJar(Server server) {
		List <String> list = new ArrayList<>();
		
	    String cmd = "kill -9  " + server.getpId();
        list = SshUtil.execute(this.isLogin(server), cmd);    
	 
        //删除日志
        //cmd = "rm -rf  " + server.getFolder() + "/" + server.getFileName().substring(0, server.getFileName().length() - 4) +".out";
        //SshUtil.execute(this.isLogin(server), cmd);    
        
		return true;
	}

4.5 显示jar包运行还是停止状态

	/**
	 * 获取运行的java进程
	 * @param server
	 * @return
	 */
	public List<Server> getProcess(Server server) {
		List <Server> listNew = new ArrayList<>();
	
	    String cmd = "jps -l";
        List<String> list = SshUtil.executeJava(this.isLogin(server), cmd);   
     
        for(int i=0; i<list.size(); i++) {
      	  if(list.get(i).contains(".jar") && !(list.get(i).contains("已杀死"))) {  	
      		    Server server1 = new Server();
    	    	String[] split = list.get(i).split(" ");
    	    	server1.setFileName(split[split.length - 1]);
    	    	server1.setpId(split[0]);    
    	    	listNew.add(server1);
    	    }  
      }
		return listNew;
	}

至此,整个程序就完成啦。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值