首页

文章

如何在java中执行shell脚本

发布网友 发布时间:2022-04-19 22:43

我来回答

2个回答

懂视网 时间:2022-04-08 09:04

        本实例为用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 MACs=umac-64@openssh.com -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”。

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






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

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

标签:shell   java执行shell脚本   shell关闭数据库   服务器   

热心网友 时间:2022-04-08 06:12

在java中执行shell脚本 用法:Runtime.getRuntime().exec("命令");
String shpath="/test/test.sh"; //程序路径
Process process =null;
String command1 = “chmod 777 ” + shpath;
try {
Runtime.getRuntime().exec(command1 ).waitFor();
} catch (IOException e1) {
e1.printStackTrace();
}catch (InterruptedException e) {
e.printStackTrace();
}

String var="201102"; /参数
String command2 = “/bin/sh ” + shpath + ” ” + var;
Runtime.getRuntime().exec(command2).waitFor();
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 年终会活动策划方案 深度解析:第一财经回放,探索财经新风向 逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 初学者怎样学电脑比较好? 如何用java执行命令行 JAVA 如何停止一个运行着的指定线程? 请问各位我是个新手,刚买了新的笔记本电脑,应该... 怎么通过java去调用并执行shell脚本以及问题总结 新手学电脑先学什么 JAVA中如何执行DOS命令 新手使用笔记本电脑有什么技巧? java怎么杀掉java进程 java中如何执行命令行语句 笔记本电脑初学者怎样使用? 怎么在java代码中写入DOS命令 运行在linux下的java程序,调用了命令行,如何让java... 电脑新手怎么学习使用电脑? 如何用Java关闭一个进程 如何在Java中执行其它程序 java中如何执行一个应用程序 java process.waitfor=3是什么意思 Java Process.waitFor()这个方法是做什么用的?是不... 怎么样找到自己电脑在局域网中的IP ? java中如何清屏? 电脑初学者怎样使用电脑? Java中有什么代码是可以清屏啊?? Process.waitFor()、Runtime.getRuntime().exec方... java accept阻塞 用Java代码怎么在浏览器中显示一个网页 新手如何买电脑? 新手上电脑怎么操作把资料考进u盘 手机的前置30W像素摄像头拍出的照片能不能看清楚? 为什么iphone4s前置摄像头只有30万像素? 手机摄像头像素:30万像素算清晰吗? 前置摄像头30万像素,后置500万,总的来说,摄像功... iphone4s前置摄像头和后置摄像头,像素各是多少? 华为前置摄像头30万像素怎么样? iphone4s前置摄像头的像素是多少?像素好吗? iphone4s前置摄像头和后置摄像头,像素各是多少 手机前置摄像头30W像素是什么效果 为什么手机前置摄像头只做成30万像素的 “摄像头像素:前:30万像素,后:500万像素”是什么意思 手机电视高清直播版本:5.8.2下载
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com