Java执行shell脚本关闭远程数据库

本实例为用Java执行shell脚本启动或关闭远程Mysql数据库,需求原因:游戏服务器合服后,为了节省内存消耗,需要关闭合服后的服务器不必要的数据库(一台服务器主机存在多个MySql数据库),以提高服务器性能,但有时需要查询历史游戏玩家信息,又需要开启数据库,为了节省运维人员的人力和时间,游戏后台就提供非运维人员都可操作开关数据库的操作。

功能实现步骤:

第一:服务器后台提供参数,发送异步请求,请求方法如下

<script type="text/javascript">
	function shutdownDatabase(param,operate){
		var arr=param.replace(/\s+/g," ").split(" ");
		if(arr.length!=3){
			alert("数据库脚本参数个数不正确,请编辑好再操作!");
			return false;
		}

		param = param + " " + operate;
		$.ajax({
			url:'XXXAction!databaseSwitch.action',
			type:"post",
			data:{"param":param},
			dataType:"json",
			async:true,
			success:function(data){
				$("#progressImgage").hide();//进度条隐藏
				$("#maskOfProgressImage").hide();//蒙版隐藏
				alert("执行结果:"+data.result);
			},
			error:function(data){
				$("#progressImgage").hide();
				$("#maskOfProgressImage").hide();
				alert("执行结果:"+data.result);
			},
			beforeSend:function(xhr){
				$("#progressImgage").show().css({
	                "position": "fixed",
	                "top": "50%",
	                "left": "50%",
	                "margin-top": function () { return -1 * $("#progressImgage").height() / 2; },
	                "margin-left": function () { return -1 * $("#progressImgage").width() / 2; }
	            });
				$("#maskOfProgressImage").show().css("opacity", "0.1");
			}
		});
	}
</script>

其中param为shell脚本参数,根据具体业务而不同。

请求等待提示代码

<img id="progressImgage" class="progress hide" alt="数据库操作中" src="./images/loading.jpg" width="250" height="200"/>
<div id="maskOfProgressImage" class="mask hide"></div>
<style type="text/css">
    .hide{display:none }
    .progress{z-index: 2000}
     .mask{position: fixed;top: 0;right: 0;bottom: 0;left: 0; z-index: 1000; background-color: #000000}
</style> 

第二,后台java代码,发送异步请求到后台java方法,java方法操作执行shell脚本,执行代码如下

/**
	 * 服务器数据库开关
	 */
	public void databaseSwitch() {
		logger.info("服务器数据库开关 start");
		PrintWriter out = null;
		try {
		    ActionContext context = ActionContext.getContext();
		    HttpServletRequest request = (HttpServletRequest)context.get(ServletActionContext.HTTP_REQUEST);
		    HttpServletResponse response = (HttpServletResponse)context.get(ServletActionContext.HTTP_RESPONSE);
		    request.setCharacterEncoding("UTF-8");
		    response.setCharacterEncoding("UTF-8");
		    out= getServletResponse().getWriter();

		    String param= request.getParameter("param");
		    if (null == param || "".equals(param)) {
		    	out.write("{\"result\":\"脚本参数不能为空"+"\"}");
		    	return;
			}
		    String shellStr = "sh /data0/mysql_actions.sh "+param;
			logger.info("执行脚本:"+shellStr);
			List<String> result = new ArrayList<String>();
			result = execShell(shellStr);

			out.write("{\"result\":\""+result.toString()+"\"}");
			logger.info("执行结果:"+result);
		} catch (UnsupportedEncodingException e1) {
			out.write("{\"result\":\"操作数据库时不支持字符编码出错!\"}");
			logger.error("execShell方法异常"+e1);
			e1.printStackTrace();
		}  catch (Exception e) {
			out.write("{\"result\":\"操作数据库出错!\"}");
			logger.error("execShell方法异常");
			e.printStackTrace();
		}
		logger.info("服务器数据库开关 end");
	}

    /**
     * 运行shell
     * @param shStr
     * 需要执行的shell
     * @return
     * @throws IOException
     */
    public static List<String> execShell(String shStr) throws Exception {
        List<String> strList = new ArrayList<String>();
        Process process;
        process = Runtime.getRuntime().exec(new String[]{"/bin/sh","-c",shStr},null,null); ////执行shell命令
        InputStreamReader ir = new InputStreamReader(process.getInputStream());
        LineNumberReader input = new LineNumberReader(ir);  //脚本输出
        String line;
        int extValue = process.waitFor();  //执行结果
        strList.add("extValue="+extValue);
        while ((line = input.readLine()) != null){
            strList.add(line);
        }
        process.destroy();//杀掉进程
        return strList;
    } 

执行脚本的主要方法为:execShell(String shStr),其中shStr参数为要执行的shell脚本,本实例的脚本写成文件直接调用,这样可读性,可移植性强。

第三,关闭远程服务器数据库

主要是在shell脚本中通过ssh,连接远程服务器,通过脚本判断数据库是否开启并执行开关操作,最后返回结果

关键代码为:

ssh="ssh -c arcfour128 -o [email protected] -o StrictHostKeyChecking=no -o GSSAPIAuthentication=no -p 22"
$ssh $1 "ps -ef |grep mysql |grep \`cat /data/${3}/mysql/port\`" &> /dev/null
    if [ $? -eq 0 ];then
        echo "主库目前已经处于运行状态"
    else
        $ssh $1 "sh /data0/${3}/mysql/start-mysql.sh &> /dev/null"
        if [ $? -eq 0 ];then
            echo "成功开启主库"
        else
            echo "开启主库失败"
        fi
    fi

其中$1参数为远程服务器ip

详细代码就不贴出来了,详解请私信我。这个功能做出来是非常耗时的,但做出来后,别人就很省时了,含金量比较大。

如果脚本不熟,需要运维人员提供。一个人写需要懂的技术很多,深度很深。

问题1:我执行脚本期间遇到一个问题就是没有在root用户下执行,导致失败,执行脚本需在管理员权限下执行才能成功。

问题2:后台需要远程服务器的无密码登录权限,通过key设置,ssh还要设置为“ForwardAgent yes”。

一切就绪后台即可执行,祝读者好运!

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-14 21:56:27

Java执行shell脚本关闭远程数据库的相关文章

Java执行Shell脚本“No such file or directory” (win-&gt;Linux)异常的可能原因

转自:http://blog.csdn.net/zlpdaisy/article/details/6134314 用Runtime.getRuntime().exec()方法执行Linux的一个Shell脚本时,报 Cannot run program "./script/abc.sh": java.io.IOException: error=2, No such file or directory] java.io.IOException: Cannot run program &q

java执行shell脚本并输出执行情况

1.脚本test.sh,置于/Users/hdwang目录下 #!/bin/sh cd /Users/hdwang echo ls:`ls` for((i=1;i<=10;i++)); do echo $(expr $i \* 3 + 1); sleep 1s done echo jps:`jps -l` 2.java执行test.sh public class ExecShell { public static void main(String[] args) { try { Process

Java执行SQL脚本文件到数据库

方式一:直接读取SQL脚本文件的内容,然后传递到SQL中. 代码:RunSqlService: @Autowired private RunSqlDao runSqlDao; /** * 读取文件内容到SQL中执行 * @param sqlPath SQL文件的路径:如:D:/TestProject/web/sql/脚本.Sql */ public void runSqlByReadFileContent(String sqlPath) throws Exception { try { Stri

JAVA远程执行Shell脚本类

1.java远程执行shell脚本类 1 package com.test.common.utility; 2 3 import java.io.IOException; 4 import java.io.InputStream; 5 import java.io.UnsupportedEncodingException; 6 import java.nio.charset.Charset; 7 8 import org.apache.commons.io.IOUtils; 9 import o

使用linux客户端执行shell脚本创建数据库初始化数据库中文乱码问题

定义了一个shell脚本,可以根据其他的多个sql文件创建数据库,并且使用包含初始化数据的sql文件初始化数据库. 在windows下使用linux客户端连接到linux服务器,执行shell脚本后,发现创建出的数据库有中文乱码. 确定是字符集设置问题.查看数据库,发现字符集设置如下,很多还是 latin1. mysql> show variables like 'character_set_%';+--------------------------+---------------------

java连接ssh执行shell脚本

在liunx上写了一个shell脚本,想通过java去调用这个shell脚本,不知道怎么去调用,在网上说使用process这个进程方式,但是我执行机和我shell脚本都不在同一台电脑,老大说java中可以连接ssh,执行shell脚本,以下代码来自他们以前的项目 public class SSH { static Connection conn = null; static String hostname = "10.40.6.232"; static String username

Shell脚本静默安装数据库Oracle 12c (Centos6)

刚入职不久,主管就叫我用shell脚本部署Oracle数据库,一开始懵的一批,手动安装也搞了很久,皇天不负有心人,哈哈!!!搞了几天终于搞好了,也搞了份脚本安装oracle.(对于经常搭建Oracle数据库,重复步骤做得很烦的盆友可以来看看) Oracle安装脚本: [[email protected] ~]# cat oracle_install.sh #!/bin/bash #install oracle #CentOS release 6.9  #关闭selinux sed -i 's/S

Java执行SQL脚本导入

今天做了一个用java导入sql脚本的功能,前台上传一个sql文件,后台先保存本地,然后进行导入.主要代码如下: String cmd = "cmd /c sqlplus usr/[email protected]{//服务器IP:1521/}sid @d:\\1.sql>d:\\t.log"; Process p = null; try {     p = Runtime.getRuntime().exec(cmd); } catch (IOException e) {    

Linux中执行shell脚本命令的4种方法总结

bash shell 脚本的方法有多种,现在作个小结.假设我们编写好的shell脚本的文件名为hello.sh,文件位置在/data/shell目录中并已有执行权限. 方法一:切换到shell脚本所在的目录(此时,称为工作目录)执行shell脚本: 复制代码 代码如下: cd /data/shell ./hello.sh ./的意思是说在当前的工作目录下执行hello.sh.如果不加上./,bash可能会响应找到不到hello.sh的错误信息.因为目前的工作目录(/data/shell)可能不在